Lombok的使用
1、什么是lombok
lombok是一种实用的工具,可以用来帮助开发人员消除Java中的冗余代码,尤其是对于简单的Java对象(POJO),它通过注解达到这一目的。
2、Lombok常用注解
2.1 @Getter/@Setter
从名字上理解,相当于为成员变量生成对应的 get 和 set 方法,同时还可以指定修饰符【默认是public】
public class Dog {
@Getter
@Setter
private Integer age;
@Getter(AccessLevel.PROTECTED)
private String name;
}
这两个注解还可以直接用在类上,可以为类里面的所有非静态成员变量生成对应的 get 和 set 方法
2.2 @ToString
本质就是生成toString方法【生成方法时会使用类中的非静态和非 transient 成员变量】
@ToString
public class Dog {
private Integer age;
private String name;
}
2.3 @EqualsAndHashCode
生成 equals 和 hashcode 方法,同时还会生成 canEqual 方法,用于判断某个对象是否是当前类及其子类的实例【生成方法时会使用类中的非静态和非 transient 成员变量】
@EqualsAndHashCode
public class Dog {
private Integer age;
private String name;
}
实际效果相当于:
public class Dog {
private Integer age;
private String name;
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Dog)) return false;
Dog other = (Dog) o;
if (!other.canEqual(this)) return false;
Object this$age = this.age, other$age = other.age;
if ((this$age == null) ? (other$age != null) : !this$age.equals(other$age)) return false;
Object this$name = this.name, other$name = other.name;
return !((this$name == null) ? (other$name != null) : !this$name.equals(other$name));
}
protected boolean canEqual(Object other) {
return other instanceof Dog;
}
public int hashCode() {
int PRIME = 59;
result = 1;
Object $age = this.age;
result = result * 59 + (($age == null) ? 43 : $age.hashCode());
Object $name = this.name;
return result * 59 + (($name == null) ? 43 : $name.hashCode());
}
}
2.4 @NonNull
public class Dog {
private static Integer age;
private String name;
public void setName(@NonNull String names){
this.name = names;
}
}
实际效果相当于:
public class Dog
{
private static Integer age;
private String name;
public void setName(@NonNull String names) {
if (names == null) throw new NullPointerException("names");
this.name = names;
}
}
2.5 @NoArgsConstructor、@RequiredArgsConstructor 、@AllArgsConstructor
1.作用
@NoArgsConstructor:为该类产生无参的构造方法
@RequiredArgsConstructor:使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法
@AllArgsConstructor:为该类产生包含所有参数的构造方法
2.示例
@RequiredArgsConstructor(staticName = "sunfire")
@AllArgsConstructor
public class Dog {
private static Integer age;
@NonNull
private String name;
private String type;
private final String res;
}
实际效果相当于:
public class Dog {
private static Integer age;
@NonNull
private String name;
private String type;
private final String res;
private Dog(@NonNull String name, String res) {
if (name == null) throw new NullPointerException("name");
this.name = name;
this.res = res;
}
public static com.luoyu.aiyu.luo1.Dog sunfire(@NonNull String name, String res) {
return new com.luoyu.aiyu.luo1.Dog(name, res);
}
@ConstructorProperties({"name", "type", "res"})
public Dog(@NonNull String name, String type, String res) {
if (name == null) throw new NullPointerException("name");
this.name = name;
this.type = type;
this.res = res;
}
}
注意
- 和前面几个注解一样,成员变量都是非静态的,另外,如果类中含有final修饰的成员变量,是无法使用@NoArgsConstructor注解的。
- 三个注解都可以指定生成的构造方法的访问权限。
- 第二个注解还可以用@RequiredArgsConstructor(staticName=”methodName”)的形式额外生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。
2.6 @Data
综合了@Getter、@Setter、@toString、@EqualsAndHashCode、@NoArgsConstructor注解。
如果同时加了@Data注解和@AllArgsConstructor注解,那么@Data注解提供的无参构造会被覆盖掉,所以建议在这二个注解同时存在的时候,建议再加一个@NoArgsConstructor注解。
2.7 @Builder
可以自动为类生成一个建造者模式的实现,以链式调用的形式创建对象、添加属性来简化对象构建过程。要注意的是,如果在类上添加@Builder注解和@NoArgsConstructor注解会产生冲突,因为一方要求生成带参数的构造函数,另一方要求生成无参构造函数。但是,可以@Builder 、@AllArgsConstructor、@NoArgsConstructor三者可以同时使用。
import lombok.Builder;
@Builder
public class User {
private Long id;
private String name;
private Integer age;
}
实际效果:
public class User {
private Long id;
private String name;
private Integer age;
public User(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private Long id;
private String name;
private Integer age;
public UserBuilder id(Long id) {
this.id = id;
return this;
}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder age(Integer age) {
this.age = age;
return this;
}
public User build() {
return new User(id, name, age);
}
}
}
原文地址:https://blog.csdn.net/m0_59749089/article/details/138002366
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!