2.7 @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
无参构造器、部分参数构造器、全参构造器 。Lombok没法实现多种参数构造器的重载 。
Lombok示例代码如下:
import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.AllArgsConstructor; import lombok.NonNull; @RequiredArgsConstructor(staticName = "of") @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ConstructorExample<T> { private int x, y; @NonNull private T description; @NoArgsConstructor public static class NoArgsExample { @NonNull private String field; } }
不使用Lombok的示例如下:
public class ConstructorExample<T> { private int x, y; @NonNull private T description; private ConstructorExample(T description) { if (description == null) throw new NullPointerException("description"); this.description = description; } public static <T> ConstructorExample<T> of(T description) { return new ConstructorExample<T>(description); } @java.beans.ConstructorProperties({"x", "y", "description"}) protected ConstructorExample(int x, int y, T description) { if (description == null) throw new NullPointerException("description"); this.x = x; this.y = y; this.description = description; } public static class NoArgsExample { @NonNull private String field; public NoArgsExample() { } } }
3 Lombok工作原理分析会发现在Lombok使用的过程中 , 只需要添加相应的注解 , 无需再为此写任何代码 。自动生成的代码到底是如何产生的呢?
核心之处就是对于注解的解析上 。JDK5引入了注解的同时 , 也提供了两种解析方式 。
- 运行时解析
- 编译时解析
1)Annotation Processing Tool
apt自JDK5产生 , JDK7已标记为过期 , 不推荐使用 , JDK8中已彻底删除 , 自JDK6开始 , 可以使用Pluggable Annotation Processing API来替换它 , apt被替换主要有2点原因:
- api都在com.sun.mirror非标准包下
- 没有集成到javac中 , 需要额外运行
JSR 269自JDK6加入 , 作为apt的替代方案 , 它解决了apt的两个问题 , javac在执行的时候会调用实现了该API的程序 , 这样我们就可以对编译器做一些增强 , 这时javac执行的过程如下:

文章插图
Lombok本质上就是一个实现了“JSR 269 API”的程序 。在使用javac的过程中 , 它产生作用的具体流程如下:
- javac对源代码进行分析 , 生成了一棵抽象语法树(AST)
- 运行过程中调用实现了“JSR 269 API”的Lombok程序
- 此时Lombok就对第一步骤得到的AST进行处理 , 找到@Data注解所在类对应的语法树(AST) , 然后修改该语法树(AST) , 增加getter和setter方法定义的相应树节点
- javac使用修改后的抽象语法树(AST)生成字节码文件 , 即给class增加新的节点(代码块)
4. Lombok的优缺点优点:
- 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法 , 提高了一定的开发效率
- 让代码变得简洁 , 不用过多的去关注相应的方法
- 属性做修改时 , 也简化了维护为这些属性所生成的getter/setter方法等
- 不支持多种参数构造器的重载
- 虽然省去了手动创建getter/setter方法的麻烦 , 但大大降低了源代码的可读性和完整性 , 降低了阅读源代码的舒适度
推荐阅读
- 太平猴魁外形品质的审评方法介绍
- 东南亚主要饮茶国名茶及其特色饮茶方式介绍
- 西湖龙井茶的采摘和加工技艺介绍
- 汕头茶厂乌龙茶精制关键环节之土炉烘焙介绍
- 茶中故旧 名茶先驱蒙山茶分类介绍
- 开淘宝店卖水果需要什么手续 怎么介绍自己的水果店铺
- 什么的野猪 中国7种野猪图片和介绍
- 茶苗根结线虫病的防治方法介绍
- 苦丁茶的嫁接繁殖技术介绍
- 云南大叶良种,景谷县大白茶介绍
