简化你的开发-使用lombok
来源:互联网 发布:大数据 算法 编辑:程序博客网 时间:2024/05/16 06:39
简化你的开发-使用lombok
Java 最使人诟病的地方,莫过于随处都有的 Getter/Setter 了;但是现在,lombok 为我们解决了这一难题。本次教程,就带大家认识 lombok,并且使用它来简化我们的 Java 开发。
集成 lombok
1. 添加 Maven 依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.16</version></dependency>
2. 安装IDE插件(此处以 Intellij 为例)
依次点击 File -> Settings -> Plugins -> Browse repositories
, 在搜索框中搜索 lombok
并安装即可。
快速使用
lombok 为我们提供了以下的注解用于简化开发:
@Getter 用于生成 getter 方法
@Setter 用于生成 setter 方法
- @NoArgsConstructor 生成无参构造方法
- @AllArgsConstructor 使用所有域生成构造方法
- @RequiredArgsConstructor 将根据使用了
final
进行修饰的域或是使用了类似于@NonNull
进行修饰的域生成构造方法 - @ToString 根据相关属性生成类
Json
格式的toString
方法 - @EqualsAndHashCode 生成
equals
和对应的hashCode
方法 - @Builder 使用构造器模式生成
build
方法 - @Default 配合
@Builder
使用 - @Value 生成不可变对象
- @Data 组合注解,结合了
@Getter, @Setter, @RequiredArgsConstructor ,@ToString @EqualsAndHashCode @Value
- @NonNull 使用此注解的属性,
lombok
将自动进行空值检查 - @Cleanup 在做文件流(或是其他资源)相关操作时,使用此注解,不管是否发生了异常,都可自动关闭流
- @Synchronized 等同于
synchronized
关键字 - @SneakyThrows 使用此注解,可自动将异常包装成 RuntimeException 并抛出,无需手动写
try{}cache(){}
注意
此处有几点需要注意:
- 当我们需要使用构造器模式时,如果需要自行初始化变量,请记得添加
@Default
注解,否则 lombok 会忽略初始值,并根据默认设置进行变量赋值 @AllArgsConstructor
@EqualsAndHashCode
需要慎重使用,否则可能导致一些意外情况
示例
@Getter@Setter@NoArgsConstructor@AllArgsConstructor@Builder@ToString@EqualsAndHashCodepublic class Student { @NonNull private String name; private Integer age; @Default private List<String> courses = new ArrayList<>();}
测试
public class StudentTest { @Test public void testLombok() throws Exception { Student student = Student.builder().name("Tom").build(); student.setAge(17); System.out.println(student.getName()+" is "+ student.getAge() +" years old"); }}
让我们反编译 lombok 生成的class文件,看看 lombok 到底做了些什么:
public class Student { @NonNull private String name; private Integer age; private List<String> courses; private static List<String> $default$courses() { return new ArrayList(); } public static Student.StudentBuilder builder() { return new Student.StudentBuilder(); } @NonNull public String getName() { return this.name; } public Integer getAge() { return this.age; } public List<String> getCourses() { return this.courses; } public void setName(@NonNull String name) { if (name == null) { throw new NullPointerException("name"); } else { this.name = name; } } public void setAge(Integer age) { this.age = age; } public void setCourses(List<String> courses) { this.courses = courses; } public Student() { } @ConstructorProperties({"name", "age", "courses"}) public Student(@NonNull String name, Integer age, List<String> courses) { if (name == null) { throw new NullPointerException("name"); } else { this.name = name; this.age = age; this.courses = courses; } } public String toString() { return "Student(name=" + this.getName() + ", age=" + this.getAge() + ", courses=" + this.getCourses() + ")"; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Student)) { return false; } else { Student other = (Student)o; if (!other.canEqual(this)) { return false; } else { label47: { Object this$name = this.getName(); Object other$name = other.getName(); if (this$name == null) { if (other$name == null) { break label47; } } else if (this$name.equals(other$name)) { break label47; } return false; } Object this$age = this.getAge(); Object other$age = other.getAge(); if (this$age == null) { if (other$age != null) { return false; } } else if (!this$age.equals(other$age)) { return false; } Object this$courses = this.getCourses(); Object other$courses = other.getCourses(); if (this$courses == null) { if (other$courses != null) { return false; } } else if (!this$courses.equals(other$courses)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof Student; } public int hashCode() { int PRIME = true; int result = 1; Object $name = this.getName(); int result = result * 59 + ($name == null ? 43 : $name.hashCode()); Object $age = this.getAge(); result = result * 59 + ($age == null ? 43 : $age.hashCode()); Object $courses = this.getCourses(); result = result * 59 + ($courses == null ? 43 : $courses.hashCode()); return result; } public static class StudentBuilder { private String name; private Integer age; private boolean courses$set; private List<String> courses; StudentBuilder() { } public Student.StudentBuilder name(String name) { this.name = name; return this; } public Student.StudentBuilder age(Integer age) { this.age = age; return this; } public Student.StudentBuilder courses(List<String> courses) { this.courses = courses; this.courses$set = true; return this; } public Student build() { return new Student(this.name, this.age, this.courses$set ? this.courses : Student.$default$courses()); } public String toString() { return "Student.StudentBuilder(name=" + this.name + ", age=" + this.age + ", courses=" + this.courses + ")"; } }}
通过反编译class文件,我们可以清楚的看到源码中同样生成了 get/set/build 等方法,只不过由之前自己手工编写变成了 lombok 帮我们生成对应的方法。
阅读全文
0 0
- 简化你的开发-使用lombok
- 使用Lombok简化你的代码
- Lombok -- 简化你的Java编码 (JDK6+)
- 使用Lombok简化java代码的编写
- lombok的使用,简化代码又省力
- lombok使用,简化代码
- 使用Lombok简化Java代码
- 使用 lombok 简化 Java 代码
- 使用 Lombok 减少你的样板代码
- 使用JSR 303和AOP简化你的接口开发
- Lombok简化Java代码的好工具
- idea中使用lombok,简化get和set方法的生成
- lombok的使用
- Lombok 的使用
- lombok的使用
- lombok插件的使用
- lombok的使用
- lombok 注解的使用
- Kubernetes和Spring Cloud哪个部署微服务更好?
- WARNING: Hessian/Burlap: 'com.github.pagehelper.Page' is an unknown class in WebappClassLoader con
- python 内建函数 str() 和 repr() 的区别
- 通过无人机获取影像或三维模型辅助小区域大比例尺地形图的想法和问题
- 嵌入式系统总结1
- 简化你的开发-使用lombok
- TCP/IP报文头部结构整理
- centos7安装redis
- 反射基础之方法调用
- day_12选择排序 Date等常用类
- 使用mongodb+pytest+allure+jenkins构建api接口自动化测试
- 七、输入输出系统:用锁实现输出、编写键盘驱动程序、环形输入缓冲区
- 让你轻松处理java异常
- 实现APP中轮播图的展示