注在类上, 是@ToString, @EqualsAndHashCode, @Getter, @Setter和@NoArgsConstructor的结合。
提供无参构造器,get方法,set方法,重写hashCode,equals,toString方法。
Aoo aoo = new Aoo();
aoo.setAttr3(true);
aoo.setAttr2("2222");
System.out.println(aoo.toString()+aoo.getAttr2());
Aoo aoo2 = new Aoo();
System.out.println(aoo.equals(aoo2)+"----");
@Data
public class Aoo {
private String attr1;
private String attr2;
private boolean attr3;
}
注意,@Data只提供无参构造器,没有全参构造器,如果需要无参构造器和全参构造器则需要将这几个注释同时使用
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Aoo {
private String attr1;
private String attr2;
private boolean attr3;
}
既可以用在类上,也可以用在单独的属性上。
// @Getter可以用在实体类上
// @Setter
public class Aoo {
private String attr1;
private String attr2;
@Getter
@Setter
private boolean attr3;
}
如果类没有使用@Data,那么可以单独需要get和set方法的属性进行设置。
并且,如果使用了boolean 类的属性,那么使用的时候,如下:
Aoo aoo = new Aoo();
aoo.setAttr3(true);
// 这里不再是getAttr3(),而是isAttr3()
System.out.println(aoo.isAttr3());
所以,如果类已经标注了@Data,就不用再使用@Setter和@Getter了。
@Getter和@Setter可以设置访问级别(默认为public)(搞不懂的去回忆一下访问修饰符)
例如:@Setter(AccessLevel.PROTECTED)
将在方法/构造函数体的开头插入一个空检查,抛出一个带有参数名称的NullPointerException作为消息。
这两个真的不常用,我一般用@Validate来限制字段不能为空
自定义对象的toString方法
其中有一个属性exclude,代表被排除的属性,toString的时候,排除该属性
其中还有一个属性of,代表被包含的属性,toString的时候,只需要那些属性
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true,exclude = "attr1")
public class Aoo {
private String attr1;
private String attr2;
private boolean attr3;
}
重写equals和hashCodef方法,
其中的exclude属性代表需要排除的equals和hashcode的属性有哪些。
其中of属性代表需要计入的属性有哪些。
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(exclude = {"attr1","attr2"})
public class Aoo {
private String attr1;
private String attr2;
private boolean attr3;
}
注意:但是一般不怎么用这个,会在stream留里面自定义比较器
在用一些输入输出流需要在finally中关闭的时候,如果添加了这个注解,就可以不写fanally了
String file = "XXX/XXX/XXX.zip";
File file1 = new File(file);
try{
// 如果此处使用了@Cleanup,就可以不写finally了,在流使用完后自动关闭
@Cleanup FileInputStream fis = new FileInputStream(file1);
int c;
while ((c = fis.read()) > 0) {
// 业务逻辑
}
}catch{
throw new XXXEXception("XXXXXXX");
}finally{
fis.close();
}
有一个很容易报错的点:如果一个类没有会成员变量,同时使用了@AllArgsConstructor和- - @NoArgsConstructor会报错构造器重复的错
让实体类使用构造者模式创建对象
@Data
@Builder
public class Aoo {
private String attr1;
private String attr2;
private boolean attr3;
}
public static void main(String[] args){
Aoo aoo = Aoo.builder().attr1("attr1").attr2("attr2").attr3(true).build();
System.out.println(aoo+"----");
}
类型将从初始化表达式中推断出来。
@val
public class Aoo {
private void doIt(){
// 类型将从初始化表达式中推断出来
val name = "张三";
val type = 2;
System.out.println(name+type);
}
}