1、什么是lombok
lombok是一种实用的工具,可以用来帮助开发人员消除Java中的冗余代码,尤其是对于简单的Java对象(POJO),它通过注解达到这一目的。
2、Lombok常用注解
2.1 @Getter/@Setter
从名字上理解,相当于为成员变量生成对应的 get 和 set 方法,同时还可以指定修饰符【默认是public】
public class Dog {@Getter@Setterprivate 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;@NonNullprivate String name;private String type;private final String res;
}
实际效果相当于:
public class Dog {private static Integer age;@NonNullprivate 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 @Slf4j
在类上面定义此注解,即可在类的方法中选择不同日志级别对应的方法打印日志:
//微量,少许的意思,级别最低;
log.trace()
//需要调试时候的关键信息打印;
log.debug()
//普通的打印信息(默认⽇志级别)
log.info()
//警告,不影响使⽤,但需要注意的问题;
log.warn()
//错误信息,级别较⾼的错误⽇志信息;
log.error()
//致命的,因为代码异常导致程序退出执⾏的事件。
log.fatal()
2.8 @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);}}
}