四、Lombok 注解详解(2)
1,@Setter 和 @Getter
(1)这两个注解用于生成 setter 和 getter 方法,可以用在类或者属性上:
- 如果用在属性上:则只为该属性提供 setter 和 getter 方法
- 如果是用在类上:则为这个类所有属性供 setter 和 getter方法
(2)下面我们在一个类上添加 @Setter 和 @Getter 注解:
package com.example.demo; import lombok.Getter; import lombok.Setter; @Getter @Setter public class User { private String name; private Integer age; }
(3)然后我们就可以直接使用它的 setter 和 getter 方法了:
User user = new User(); user.setName("hangge"); user.setAge(123); user.getName(); user.getAge();
2,@Getter(lazy=true)
(1)该标注用于生成一个 lazy 版的 getter,它会在第一次调用这个 getter 时计算一次值,然后从那里开始缓存它。如果计算该值需要大量 CPU,或者该值占用大量内存,这可能很有用。
注意:Lombok 会自动去管理线程安全的问题,所以不会存在重复赋值的问题。
(2)要使用此功能,需要创建一个 private final 变量,并且使用运行成本高的表达式对其进行初始化,同时使用 @Getter(lazy=true) 注解进行标注。
1 // 使用注解 2 public class GetterLazyExample { 3 @Getter(lazy=true) private final double[] cached = expensive(); 4 5 private double[] expensive() { 6 double[] result = new double[1000000]; 7 for (int i = 0; i < result.length; i++) { 8 result[i] = Math.asin(i); 9 } 10 return result; 11 } 12 } 13 14 // 不使用注解 15 public class GetterLazyExample { 16 private final java.util.concurrent.AtomicReference<java.lang.Object> cached = 17 new java.util.concurrent.AtomicReference<java.lang.Object>(); 18 19 public double[] getCached() { 20 java.lang.Object value = this.cached.get(); 21 if (value == null) { 22 synchronized(this.cached) { 23 value = this.cached.get(); 24 if (value == null) { 25 final double[] actualValue = expensive(); 26 value = actualValue == null ? this.cached : actualValue; 27 this.cached.set(value); 28 } 29 } 30 } 31 return (double[])(value == this.cached ? null : value); 32 } 33 34 private double[] expensive() { 35 double[] result = new double[1000000]; 36 for (int i = 0; i < result.length; i++) { 37 result[i] = Math.asin(i); 38 } 39 return result; 40 } 41 }
3,@ToString
(1)@ToString 注解在类上, 为类提供 toString() 方法:- 默认情况下,它会按顺序(以逗号分隔)打印这个类名称以及每个字段。
- 可以这样设置不包含哪些字段:@ToString(exclude = "id") 或者 @ToString(exclude = {"id","name"})
1 package com.example.demo; 2 3 import lombok.Getter; 4 import lombok.Setter; 5 import lombok.ToString; 6 7 @Getter 8 @Setter 9 @ToString 10 public class User { 11 private String name; 12 private Integer age; 13 }
(2)下面是一个简单的测试样例:
1 User user = new User(); 2 user.setName("hangge"); 3 user.setAge(123); 4 System.out.println(user.toString());
4,@EqualsAndHashCode
(1)当其注解在类上,为该类提供 hashCode() 和 equals() 方法:
- 默认情况下,它将使用所有非静态,非 transient 字段。
- 可以通过在可选的 exclude 参数中来排除更多字段。
- 也可以通过在 parameter 参数中命名它们来准确指定希望使用哪些字段。
1 package com.amos.lombok; 2 3 import lombok.EqualsAndHashCode; 4 5 @EqualsAndHashCode 6 public class EqualsAndHashCodeExample { 7 8 private transient int transientVar = 10; 9 private String name; 10 private double score; 11 12 /** 13 * 不包含该字段 14 */ 15 @EqualsAndHashCode.Exclude 16 private Shape shape = new Square(5, 10); 17 private String[] tags; 18 19 /** 20 * 不包含该字段 21 */ 22 @EqualsAndHashCode.Exclude 23 private int id; 24 25 public String getName() { 26 return this.name; 27 } 28 29 @EqualsAndHashCode(callSuper = true) 30 public static class Square extends Shape { 31 private final int width, height; 32 33 public Square(int width, int height) { 34 this.width = width; 35 this.height = height; 36 } 37 } 38 39 public static class Shape { 40 } 41 }
(2)上面编译后会变成如下代码:
1 package com.amos.lombok; 2 3 import java.util.Arrays; 4 5 public class EqualsAndHashCodeExample { 6 private transient int transientVar = 10; 7 private String name; 8 private double score; 9 private EqualsAndHashCodeExample.Shape shape = new EqualsAndHashCodeExample.Square(5, 10); 10 private String[] tags; 11 private int id; 12 13 public EqualsAndHashCodeExample() { 14 } 15 16 public String getName() { 17 return this.name; 18 } 19 20 public boolean equals(final Object o) { 21 if (o == this) { 22 return true; 23 } else if (!(o instanceof EqualsAndHashCodeExample)) { 24 return false; 25 } else { 26 EqualsAndHashCodeExample other = (EqualsAndHashCodeExample)o; 27 if (!other.canEqual(this)) { 28 return false; 29 } else { 30 label31: { 31 Object this$name = this.getName(); 32 Object other$name = other.getName(); 33 if (this$name == null) { 34 if (other$name == null) { 35 break label31; 36 } 37 } else if (this$name.equals(other$name)) { 38 break label31; 39 } 40 41 return false; 42 } 43 44 if (Double.compare(this.score, other.score) != 0) { 45 return false; 46 } else { 47 return Arrays.deepEquals(this.tags, other.tags); 48 } 49 } 50 } 51 } 52 53 protected boolean canEqual(final Object other) { 54 return other instanceof EqualsAndHashCodeExample; 55 } 56 57 public int hashCode() { 58 int PRIME = true; 59 int result = 1; 60 Object $name = this.getName(); 61 int result = result * 59 + ($name == null ? 43 : $name.hashCode()); 62 long $score = Double.doubleToLongBits(this.score); 63 result = result * 59 + (int)($score >>> 32 ^ $score); 64 result = result * 59 + Arrays.deepHashCode(this.tags); 65 return result; 66 } 67 68 public static class Shape { 69 public Shape() { 70 } 71 } 72 73 public static class Square extends EqualsAndHashCodeExample.Shape { 74 private final int width; 75 private final int height; 76 77 public Square(int width, int height) { 78 this.width = width; 79 this.height = height; 80 } 81 82 public boolean equals(final Object o) { 83 if (o == this) { 84 return true; 85 } else if (!(o instanceof EqualsAndHashCodeExample.Square)) { 86 return false; 87 } else { 88 EqualsAndHashCodeExample.Square other = (EqualsAndHashCodeExample.Square)o; 89 if (!other.canEqual(this)) { 90 return false; 91 } else if (!super.equals(o)) { 92 return false; 93 } else if (this.width != other.width) { 94 return false; 95 } else { 96 return this.height == other.height; 97 } 98 } 99 } 100 101 protected boolean canEqual(final Object other) { 102 return other instanceof EqualsAndHashCodeExample.Square; 103 } 104 105 public int hashCode() { 106 int PRIME = true; 107 int result = super.hashCode(); 108 result = result * 59 + this.width; 109 result = result * 59 + this.height; 110 return result; 111 } 112 } 113 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!