文章9 | 阅读 3676 | 点赞0
@Data
是一个方便的快捷方式注释,它将@ToString
,@EqualsAndHashCode
,@Getter/@Setter
和@RequiredArgsConstructor
的特性捆绑在一起。换句话说,@Data生成通常与简单POJOs
和beans
配合使用,它会进行以下操作:
getter
,所有非final
字段的setter
,toString
,equals
,和hashCode
,final
字段,和所有使用@NonNull
标记却没有初始化值的非final字段,从而确保字段永远不为空。@Data
public class User {
private final Integer id;
private final String zipCode = "215500";
@NonNull
private String username;
private String password;
}
// 编译后:
public class User {
private final Integer id;
private final String zipCode = "215500";
@NonNull
private String username;
private String password;
// 生成带有未初始化的 final 字段,以及标有 @NonNull 的字段
public User(Integer id, @NonNull String username) {
if (username == null) {
throw new NullPointerException("username is marked @NonNull but is null");
} else {
this.id = id;
this.username = username;
}
}
public Integer getId() { return this.id; }
public String getZipCode() {
this.getClass();
return "215500";
}
@NonNull
public String getUsername() { return this.username; }
public String getPassword() { return this.password; }
// 只生成非 final 的字段的 setter 方法
public void setUsername(@NonNull String username) {
if (username == null) {
throw new NullPointerException("username is marked @NonNull but is null");
} else {
this.username = username;
}
}
public void setPassword(String password) { this.password = password; }
// 省略 toString,canEquals,equals,hashCode 相关代码
}
看到编译后地代码,可以明确地看到为我们生成了所有参数的getter&setter
,constructor
,toString
,hashCode
。你可能会说@Data
一个注解就能满足实际工作需求,莫急,听我慢慢道来……
现在我们再来解释一下上面说的几条生成规则:
可以看到所有的字段的getter
都被生成,非final
的setter
方法被生成。(这主要是因为,在构造方法中对final
字段进行了初始化,要知道final
字段一旦被初始化后,将不能再被修改)
实现相应类字段的toString
,equals
,和hashCode
,这没得说。
再看最后一个,再生成构造器时,会生成带有这样两种参数的构造器:
实体类有未被初始化的 final
字段
实体类中标有@NonNull
注解的字段
当我看到@Data的注解源码时,心里是抵触的,不愿接受的,这么好用的功能,为啥就不能丰富一下呢?
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
// 使用静态构造方法,私有实体构造器,通过 staticConstructor 配置静态构造方法的名称
String staticConstructor() default "";
}
getter
和setter
默认是public
的,如果需要改变修饰符请使用@Setter
和@Getter
;transient
类型的变量不会被hashcode
和equals
使用,静态变量也会被跳过;@Data
注解非常有用,但是它没有与其他注解相同的控制粒度。@Data提供了一个可以生成静态工厂的单一参数,将staticConstructor
参数设置为所需要的名称,Lombok
自动生成的构造函数设置为私有,并提供公开的给定名称的静态工厂方法@Data(staticConstructor=”of”)@Data
和@AllArgsConstructor
后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor
也是抵触的,啥配置也没提供!
lombok.data.flagUsage = [warning | error] (default: not set)
Immutable classes made very easy.
@Value
promoted to the main lombok
package since lombok v0.12.0.
@Value
注解用于修饰类,相当于是@Data的不可变形式,因为字段都被修饰为private
和final
,默认的情况下不会生成settter
。还有一点更狠的,默认类本身也是final
的,不能被继承。
官方给出:实际上@Value相当于:final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter
先不说那么多,小试牛刀一下:
@Value
public class User {
private final Integer id;
private final String zipCode = "215500";
@NonNull
private String username;
private String password;
}
// 编译后:
public final class User {
private final Integer id;
private final String zipCode = "215500";
@NonNull
private final String username;
private final String password;
public User(Integer id, @NonNull String username, String password) {
if (username == null) {
throw new NullPointerException("username is marked @NonNull but is null");
} else {
this.id = id;
this.username = username;
this.password = password;
}
}
public Integer getId() { return this.id; }
public String getZipCode() {
this.getClass();
return "215500";
}
@NonNull
public String getUsername() { return this.username; }
public String getPassword() { return this.password; }
// 省略 toString,canEquals,equals,hashCode 相关代码
}
在编译后地代码中,没有发现setter
方法,会生成一个带有所有的非final字段和未初始化的final字段的构造器。
生成相应的toString,canEquals,equals,hashCode
方法
多么痛的领悟!感觉@Data和@Value都是潜力股
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Value {
// 使用静态构造方法,私有实体构造器,通过 staticConstructor 配置静态构造方法的名称
String staticConstructor() default "";
}
这个全局配置没啥好说的……
lombok.value.flagUsage = [warning | error] (default: not set)
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_41540822/article/details/86606535
内容来源于网络,如有侵权,请联系作者删除!