在我们平时的开发中创建JAVA对象(POJO),也就是JavaBean是再常见不过的工作了,一个普通的实体一般都会有对象的属性,以及属性对应的getter和setter方法,再加上构造函数、toString、hashCode、equals等等方法,简单的一个java对象,少则几十行,多着几百上千行。
代码冗长,阅读性相对较差(虽然习惯了也不怎么觉得)。
而lombok能很好的解决这个问题,消除代码的冗长。
进入正题,首先想要使用lombok进行编码,需要先安装lombok插件,如何安装可以看我上一篇博文。
安装好之后,在项目中添加lombok jar包的依赖,以maven为例(我使用的是1.18.4的版本)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
添加完依赖之后就能进行编码了。
接下来我们来讲讲lombok常用annotation,以及效果。
@Data
是lombok中最常用的注释了,它集合了@ToString, @EqualsAndHashCode, @Getter和@Setter
注意点1: 同时使用@Data 和 @AllArgsConstructor 后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor。
注意点2:当java对象有继承了父类方法的时候,需要同时使用@EqualsAndHashCode(callSuper=false),callSuper是指equals和hashCode是不是需要包含父类的属性,false为不包含父类属性
@Data
@EqualsAndHashCode(callSuper=false)
public class UserInfoVO extends BaseBO{
//用户Id
private Integer uId;
//手机号
private String mobilePhone;
//用户名
private String userName;
//注册来源
private String source;
//注册Ip
private String userIp;
//注册时间
private Date regTime;
//姓名
private String realName;
//身份证号
private String idCard;
//省份编号
private String province;
//城市编号
private String city;
//区县编号
private String region;
//详细地址
private String streetAddress;
//邮编
private String zipCode;
}
@Getter和@Setter
注释分别为属性生成getter和setter,注释类的话会生成所有属性的getter和setter方法。
//用户Id
@Getter@Setter
private Integer uId;
//手机号
@Getter@Setter
private String mobilePhone;
相当于
//用户Id
private Integer uId;
//手机号
private String mobilePhone;
public Integer getuId() {
return uId;
}
public void setuId(Integer uId) {
this.uId = uId;
}
public String getMobilePhone() {
return mobilePhone;
}
public void setMobilePhone(String mobilePhone) {
this.mobilePhone = mobilePhone;
}
@ToString@EqualsAndHashCode
@ToString生成toString方法,@EqualsAndHashCode生成equals方法和hashCode方法。
@NonNull
判断是否为空,如果为空,则抛出java.lang.NullPointerException
@Cleanup
这个注释可用于确保释放分配的资源,当局部变量被注释为@Cleanup,任何后续代码都包装在try/finally块,该块确保在当前作用域结束时调用清理方法。
@Cleanup
InputStream in = new FileInputStream(args[0]);
@Cleanup
OutputStream out = new FileOutputStream(args[1]);
这个我平时用到的并不多,很少有在实体中使用输入输出流。
@Synchronized@SneakyThrow
这两个同样很少用到,需要用到的可以去深入研究一下。