一、@Data
- @Data()提供一个包含有final修饰的属性的构造方法
原代码:
@Data
public class ServiceLevelOutVO {
private final String road;
}
编译后:
@Data
public class ServiceLevelOutVO {
private final String road;
public ServiceLevelOutVO(String road) {
this.road = road;
}
// ... 省略equals等方法
}
- @Data(staticConstructor = “of”),提供一个以of为方法名以及包含有final修饰的属性的构造方法。
原代码:
@Data(staticName = "of")
public class ServiceLevelOutVO {
private final String road;
}
编译后:
@Data(staticName = "of")
public class ServiceLevelOutVO {
private final String road;
private ServiceLevelOutVO(String road) {
this.road = road;
}
public static ServiceLevelOutVO of(String road) {
return new ServiceLevelOutVO(road);
}
// ... 省略equals等方法
}
- 以上的前提是没有使用lombok有关提供构造方法的注解、没有手动编写构造函数
@Data(staticName = "of")
@AllArgsConstructor
public class ServiceLevelOutVO {
private final String road;
public ServiceLevelOutVO(String road, String updateTime, List<String> period, List<Float> level) {
this.road = road;
this.updateTime = updateTime;
this.period = period;
this.level = level;
}
// ... 省略equals等方法
}
二、@RequiredArgsConstructor
- @RequiredArgsConstructor()生成带有必需参数的构造函数、必要参数的判定条件是该类中被final修饰的属性
原代码:
@RequiredArgsConstructor
public class ServiceLevelOutVO {
private final String road;
}
编译后的代码:
@RequiredArgsConstructor
public class ServiceLevelOutVO {
private final String road;
public ServiceLevelOutVO(String road) {
this.road = road;
}
}
- @RequiredArgsConstructor(staticName = “init”),会生成一个以init为方法名的静态方法以及一个包含必需参数的构造方法进行初始化。
原代码:
@RequiredArgsConstructor(staticName = "init")
public class ServiceLevelOutVO {
private final String road;
}
编译后的代码:
@RequiredArgsConstructor(staticName = "init")
public class ServiceLevelOutVO {
private final String road;
private ServiceLevelOutVO(String road) {
this.road = road;
}
public static ServiceLevelOutVO init(String road) {
return new ServiceLevelOutVO(road);
}
}
三、@Getter、@Setter
为实体类属性提供get、set方法
四、 @NotNull
用于校验属性非空,如果为空则抛出异常
@Data
public class ServiceLevelOutVO {
@NotNull(message = "road不能为空")
private final String road;
}
五、@Cleanup
样例代码:
public void testCleanUp() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
等价于 Java 源码:
public void testCleanUp() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
六、@EqualsAndHashCode、@ToString
- @EqualsAndHashCode为实体类提供equals和hasCode方法
- @ToString提供toString方法
七、@SneakyThrows
标记在方法上不需要手动throw异常
@SneakyThrows
public void testSneakyThrows() {
throw new IllegalAccessException();
}
八、@Synchronized
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
@Synchronized
public String synchronizedFormat(Date date) {
return format.format(date);
}
等价于
private final java.lang.Object $lock = new java.lang.Object[0];
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
public String synchronizedFormat(Date date) {
synchronized ($lock) {
return format.format(date);
}
}
九、@Builder
@Builder提供一套建造者模式的代码,调用时可以使用链式进行实体构建
-
builderMethodName:指定创建内部静态类的方法名,默认值为 builder
-
buildMethodName:指定创建实体类的方法名,默认值为 build
-
builderClassName:指定内部静态的类名,默认值为 “”,默认创建的类名为thisclassBuilder
-
toBuilder:设置为 true 可以对这个对象进行拷贝生成新的对象,可以再修改,默认为 false
-
access:设置 builderMethodName 的访问权限修饰符,默认为 public
共有 PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE,其中 MODULE 是 Java 9 的新特性 -
setterPrefix:设置 setter 方法的前缀,默认为 “”
调用:
ServiceLevelOutVO outVO = ServiceLevelOutVO.builder().road("北京路").build();
原代码:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ServiceLevelOutVO {
private String road;
}
编译后:
public class ServiceLevelOutVO {
private String road;
public static class ServiceLevelOutVOBuilder {
private String road;
private String updateTime;
private List<String> period;
private List<Float> level;
ServiceLevelOutVOBuilder() {
}
public ServiceLevelOutVOBuilder road(String road) {
this.road = road;
return this;
}
public ServiceLevelOutVOBuilder updateTime(String updateTime) {
this.updateTime = updateTime;
return this;
}
public ServiceLevelOutVOBuilder period(List<String> period) {
this.period = period;
return this;
}
public ServiceLevelOutVOBuilder level(List<Float> level) {
this.level = level;
return this;
}
public ServiceLevelOutVO build() {
return new ServiceLevelOutVO(this.road, this.updateTime, this.period, this.level);
}
public String toString() {
return "ServiceLevelOutVO.ServiceLevelOutVOBuilder(road=" + this.road + ", updateTime=" + this.updateTime + ", period=" + this.period + ", level=" + this.level + ")";
}
}
}
参考文献
https://hezhiqiang8909.gitbook.io/java/docs/javalib/lombok
https://blog.csdn.net/qq_39249094/article/details/120881578