介绍和理解
@Data注解来源于lombom,引入后可以简化一般实体类的get, set, toString,construct(构造函数)等的书写,简洁化代码。
在编译阶段改变了class文件的生成方式,使得相关方法加入到编译后的文件中可以正常使用。但这样影响源码的可阅读性,若别人不清楚这一块的内容对一些问题的排查不仅没有帮助,反而会增加难度。
但具体使用场景随着不同的项目合适度是不同的,这个具体根据场景决定是否适用。在一些场景下反而会显得更简单。
一般的get,set,toString,构造函数,hash等大部分开发工具都可以通过快捷键生成,个别场景可能也会在基本的get,set方法中做一些微小的改动。
引入方式
Mave
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope><!-- 可以没有 -->
</dependency>
开发工具中若代码报错但可以编译成功,则需要给开发工具引入插件 lombok,在plugins中,若为IDEA则在Settings中,找到plugins 然后下载安装 lombok插件,重启开发工具即可。
示例
一般实体写法
public class Man {
private String name;
private int age;
private float height;
private float weight;
public Man() {
}
public Man(String name, int age, float height, float weight) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Man{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
", weight=" + weight +
'}';
}
}
使用lombok后
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Man {
private String name;
private int age;
private float height;
private float weight;
}
lombok常见注解
@Data : 注解在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注解在类上,提供全参构造
@NoArgsConstructor : 注解在类上,提供无参构造
@Setter : 注解在属性上,提供 set 方法
@Getter : 注解在属性上,提供 get 方法
@EqualsAndHashCode : 注解在类上,提供 equals 和 hashCode 方法
@Log4j/@Slf4j : 注解在类上,提供Logger 对象,变量名为 log
@Builder
直译过来就是构建
使用构造者模式,提供构建一个对象的方法即
类 对象 = 类名.builder().属性1(值1).属性2(值2).属性3(值3).build()
注意:
@Data 和 @Builder 一起使用时会编译报错
解决方式如下:
方式一:同时添加 @AllArgsConstructor @NoArgsConstructor
例如:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class HumanBeing {
private long UID;
private String name;
private String code;
private byte sex;
}
方式二: 手动添加无参构造方法,然后添加 注解 @Tolerate (容许)
例如:
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
@Data
@Builder
public class Clothes {
private String name;
private String type;
private double price;
private double weight;
private String size;
@Tolerate
public Clothes(){
}
}
具体使用时则如下使用
public static void main(String[] args) {
HumanBeing nnname = HumanBeing.builder().UID(1151264826104L).name("nnname").build();
long uid = nnname.getUID();
System.out.println(uid);
nnname.setUID(548645L);
System.out.println(nnname.getUID());
}
运行结果如下:
1151264826104
548645
总结:
到这里我理解该注解相当于在使用一个更灵活的构造函数去构造一个对象。
@Accessors
直译为:访问器
说实话,看讲解的时候没太看明白,这里就说两种使用方法的对比,起码看得懂什么意思。
看起来相当于简化了方法前缀,使得像是在访问JSON 对象一样。
实际使用时属性的get set 方法名将一致,但做了重载,存在入参时为赋值语句,没有参数时为获取语句。
Accessors 有三个属性 fluent chain prefix
fluent = true 时例子如下:(fluent 直译为 流利)
实体定义如下:
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(fluent = true)
public class Shoes {
private String name;
private String size;
private String color;
}
使用时
public static void main(String[] args) {
Shoes shoes = new Shoes().name("8848").size("43").color("#FF0000");
System.out.println(shoes.name());
System.out.println(shoes.color());
}
使用 chain 时 实体如下定义:
chain 直译为 链条
@Data
@Accessors(chain = true)
public class Shoes {
private String name;
private String size;
private String color;
}
使用结果如下:
Shoes shoes = new Shoes().setName("4848486").setSize("XXL");
Shoes shoes1 = shoes.setColor("rr");
String name = shoes.getName();
可以看的出,依旧使用了get set 方法,但是set 的返回值依旧为对象自己,所以可以连续调用,get 返回依旧为本身。