SpringBoot - Lombok使用详解2(@Setter、@Getter、@ToString、@EqualsAndHashCode)

5 篇文章 0 订阅

四、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 }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: @Data、@Setter、@GetterLombok库中的注解。 @Data注解是一个组合注解,包含了@ToString、@EqualsAndHashCode、@Getter和@Setter等注解。使用@Data注解可以省略生成gettersetter方法、toString方法、hashCode方法和equals方法的样板代码。 @Setter注解用于生成setter方法,通过使用@Setter注解可以省略生成setter方法的样板代码。 @Getter注解用于生成getter方法,通过使用@Getter注解可以省略生成getter方法的样板代码。 ### 回答2: @Data、@Setter、@GetterJava语言中常用的注解之一,用于自动生成Java Bean类的gettersetter方法。 @Data注解是一个复合注解,它包含了@Setter和@Getter注解。使用@Data注解可以简化代码,自动生成类的gettersetterequalshashCodetoString方法。这样可以避免手动编写这些常用方法,提高代码的可读性和可维护性。 @Setter注解用于自动生成属性的setter方法。使用@Setter注解后,编译器会自动生成setter方法,从而简化了代码编写。setter方法用于修改类的属性值,通过传入参数来改变属性的值。使用@Setter注解可以避免手动编写大量类似的setter方法,提高代码的效率。 @Getter注解用于自动生成属性的getter方法。使用@Getter注解后,编译器会自动生成getter方法,从而简化了代码编写。getter方法用于获取类的属性值,用于将类的属性值传递给其他方法或对象。使用@Getter注解可以避免手动编写大量类似的getter方法,提高代码的效率。 综上所述,@Data、@Setter、@GetterJava语言中常用的注解,用于自动生成Java Bean类的gettersetter方法。使用这些注解可以简化代码,提高代码的可读性和可维护性。 ### 回答3: @Data、@Setter、@GetterJava 中的注解,用于简化代码的编写。它们是 Lombok(简化 Java 开发工作的工具)中提供的注解之一。 @Data 注解是一个组合注解,它为类自动生成了一系列的方法,包括构造方法、toStringhashCodeequals 等。使用 @Data 注解可以省去手动编写这些常用方法的麻烦,从而提高开发效率。 @Setter 注解用于自动生成属性的 setter 方法。在类的属性上使用 @Setter 注解后,Lombok 会自动生成对应的 setter 方法,用于给属性赋值。该注解可以帮助开发人员简化代码、减少冗余。 @Getter 注解用于自动生成属性的 getter 方法。在类的属性上使用 @Getter 注解后,Lombok 会自动生成对应的 getter 方法,用于获取属性的值。使用 @Getter 注解可以简化代码,并提高代码的可读性。 综上所述,@Data、@Setter、@GetterLombok 中提供的注解,它们能够帮助开发人员简化代码,提高开发效率。@Data 注解为类自动生成一系列常用方法,@Setter 注解用于自动生成属性的 setter 方法,@Getter 注解用于自动生成属性的 getter 方法。通过使用这些注解,可以减少冗余代码的编写,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈哈一下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值