Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。
Lombok是一款Java代码功能增强库。它会自动集成到你的编辑器和构建工具中,从而使你的Java代码更加生动有趣。通过Lombok的注解,你可以不用再写getter、setter、equals等方法,Lombok将在编译时为你自动生成。
将Lombok导入classpath或者POM导入
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。
添加IDE工具对Lombok的支持
Lombox注解
@Setter --> 此注解在属性上,可以为相应的属性自动生成Setter方法
@Getter --> 此注解在属性上,可以为相应的属性自动生成Getter方法
@Data --> 注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Log --> 在需要打印日志的类中使用
@AllArgsConstructor --> 此注解在类上,会自动生成全参构造函数
@NoArgsConstructor --> 此注解在类上,会自动生成无参构造器
@EqualsAndHashCode --> 此注解在类上,会自动生成对应的equals方法和hashCode方法
@NonNull --> 该注解用在属性或构造器上,会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
@Cleanup --> 该注解能帮助我们自动调用close()方法,很大的简化了代码。
@ToString --> 此注解在类上,,会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。
@RequiredArgsConstructor --> 此注解在类上,自动生成部分参数构造函数
@Value --> @Value注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法
@Synchronized --> 此注解在方法是,注解自动添加到同步机制,生成的代码并不是直接锁方法,而是锁代码块
@Builder --> 建造者模式
@Delegate --> 代理模式
@Accessors -->链式风格,在调用set方法时,返回这个类的实例对象
官网注解
参考文档
很全面的参考文档
Lombox常用注解
参考文档
@NonNull
在方法上使用@NonNull注解可以做非空判断,如果传入空值的话会直接抛出。
private String name;
public setName(@NonNull String name){
this.name = name;
}
编译后的效果:
public NonNullExample(@NonNull String name) {
if (name == null) {
throw new NullPointerException("name is marked non-null but is null");
} else {
this.name = name;
}
}
@Getter/@Setter
@Getter/@Setter注解自动生成getter/setter方法。
@Getter(lazy=true)
当我们获取某一个属性比较消耗资源时,可以给@Getter添加lazy=true属性实现懒加载,会生成Double Check Lock 样板代码对属性进行懒加载。
package bolen.example.pojo;
import lombok.Getter;
import lombok.Setter;
public class UserTwo {
@Getter
@Setter
private int id;
@Getter
@Setter
private String username;
@Getter
@Setter
private String password;
}
当安装了Lombox插件和导入工具包后没有setter或getter方法的报错,也可以正常调用setter和getter方法。
@Cleanup
@Cleanup
InputStream in = new FileInputStream(args);
@Cleanup
OutputStream out = new FileOutputStream(args);
OI流回自动关闭。不需要in.close()
和 out.close()
手动关闭。
@ToString
把所有类属性都编写到toString方法中方便打印日志。使用@ToString注解可以自动生成toString方法,默认会包含所有类属性,使用@ToString.Exclude
注解可以排除属性的生成。
@ToString
public class ToStringExample {
@ToString.Exclude
private Long id;
private String name;
private Integer age;
public ToStringExample(Long id,String name,Integer age){
this.id =id;
this.name = name;
this.age = age;
}
编译后的效果:
public class ToStringExample {
private Long id;
private String name;
private Integer age;
public ToStringExample(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public String toString() {
return "ToStringExample(name=" + this.name + ", age=" + this.age + ")";
}
}
@ToString.Exclude
注解可以排除属在toString方法中。
@XXXConstructor
@NoArgsConstructor
:生成无参构造函数。
@RequiredArgsConstructor
:生成包含必须参数的构造函数,使用@NonNull注解的类属性为必须参数。
@AllArgsConstructor
:生成包含所有参数的构造函数。
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class ConstructorExample {
@NonNull
private Long id;
private String name;
private Integer age;
/**
...
*/
}
@Data
@Data是一个方便使用的组合注解,是@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的组合体。
@Data
public class DataExample {
@NonNull
private Long id;
@EqualsAndHashCode.Exclude
private String name;
@EqualsAndHashCode.Exclude
private Integer age;
}
编译后的效果:
public class DataExample {
@NonNull
private Long id;
private String name;
private Integer age;
public DataExample(@NonNull final Long id) {
if (id == null) {
throw new NullPointerException("id is marked non-null but is null");
} else {
this.id = id;
}
}
@NonNull
public Long getId() {
return this.id;
}
public String getName() {
return this.name;
}
public Integer getAge() {
return this.age;
}
public void setId(@NonNull final Long id) {
if (id == null) {
throw new NullPointerException("id is marked non-null but is null");
} else {
this.id = id;
}
}
public void setName(final String name) {
this.name = name;
}
public void setAge(final Integer age) {
this.age = age;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof DataExample)) {
return false;
} else {
DataExample other = (DataExample)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$id = this.getId();
Object other$id = other.getId();
if (this$id == null) {
if (other$id != null) {
return false;
}
} else if (!this$id.equals(other$id)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof DataExample;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $id = this.getId();
int result = result * 59 + ($id == null ? 43 : $id.hashCode());
return result;
}
public String toString() {
return "DataExample(id=" + this.getId() + ", name=" + this.getName() + ", age=" + this.getAge() + ")";
}
}
@Value
使用@Value注解可以把类声明为不可变的,声明后此类相当于final类,无法被继承,其属性也会变成final属性。
@Value
public class ValueExample {
private Long id;
private String name;
private Integer age;
public static void main(String[] args) {
//只能使用全参构造器
ValueExample example = new ValueExample(1L,"test",20);
// example.setName("andy") //没有生成setter方法,会报错
// example.name="andy" //字段被设置为final类型,会报错
}
}
编译后的效果:
public final class ValueExample {
private final Long id;
private final String name;
private final Integer age;
public static void main(String[] args) {
new ValueExample(1L, "test", 20);
}
public ValueExample(final Long id, final String name, final Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return this.id;
}
public String getName() {
return this.name;
}
public Integer getAge() {
return this.age;
}
}
@SneakyThrows
使用@SneakyThrows注解的自动抛出异常。
public class SneakyThrowsExample {
//自动抛出异常,无需处理
@SneakyThrows(UnsupportedEncodingException.class)
public static byte[] str2byte(String str){
return str.getBytes("UTF-8");
}
public static void main(String[] args) {
String str = "Hello World!";
System.out.println(str2byte(str).length);
}
}
编译后的效果:
public class SneakyThrowsExample {
public SneakyThrowsExample() {
}
public static byte[] str2byte(String str) {
try {
return str.getBytes("UTF-8");
} catch (UnsupportedEncodingException var2) {
throw var2;
}
}
}
@Log
@Log
public class LogExample {
public static void main(String[] args) {
log.info("level info");
log.warning("level warning");
log.severe("level severe");
}
}
@Slf4j
使用Lombok生成日志对象时,根据使用日志实现的不同,有多种注解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156271.html