Lombok 是一种 Java™ 实用工具 , 可用来帮助开发人员消除 Java 的冗长 . 尤其是对于简单的 Java 对象(POJO) . 它通过注解实现这一目的 . 如图所示 :
使用Lombok前 :
使用Lombok后 :
并且使用Lombok相关方法的调用与平常并无差别 , 不用更改任何语法 .
下面 , 让我们来看一下如何使用这个开发利器吧 .
1.1 Idea安装Lombok
1.1.1打开设置 - > 安装插件
1.1.2 选择从插件资源库或本地硬盘安装
1.1.3 安装成功 , 重启idea
1.2 eclipse 安装Lombok
1.2.1 将从官网下载的lombok.jar复制到eclipse安装根目录下
下载地址
1.2.2 安装配置
官方说只需双击lombok.jar就能自动安装 , 我试过几次都不行 , 所以还是手动配置吧 . 需要再eclipse.ini中添加一下两行内容
-Xbootclasspath/a:lombok.jar
-javaagent:lombok.jar
1.2.3 安装成功 , 重启eclipse并clean项目
注意 : 依赖范围选择provided , 这也是官方建议 , Lombok在编译期会自动将所有java文件编译成正常的class
org.projectlombok
lombok
1.16.20
provided
注意 , Lombok不只是支持本文中说到的注解 , 但强烈建议用到这些就足够你省出很多时间了 .
3.1 @Setter/Getter
注解到属性上 ,为当前属性提供set/get方法 . 注解到类上 ,为该类所有属性提供set/get方法
3.2 @toString
仅注解到类上 , 提供所有属性的toString方法
3.3 @EqualsAnsHashCode
仅注解到类上 , 提供equals , canEquals , hashCode方法
3.4 @Data
最常用的一个 , 注解到类上 , 提供所有属性的set/get方法 , 以及equals , canEquals , hashCode , toString方法
3.5 @AllArgsConstructor
注解到类上 , 提供一个 , 全参的构造方法 , 注意此时java默认提供的空构造就不再有了
3.6 @NoArgsConstructor
注解到类上 , 提供一个无参的空构造方法 , 一般搭配@AllArgsConstructor使用
3.7 @Builder
注解到类上 , 为当前对象增加一个Builder静态内部类 , 可以使用Builder的方式构造对象
它有一个常用的属性 , 一般结合使用 , 可以来将实例化的对象重新转成Builder对象
3.8 @Log / @Log4j / @Log4j2 / @Slf4j
注解到类上 , 提供一个属性名为log的日志对象 , private static final修饰 , 可以根据自己项目中的日志框架选择不同的注解
3.9 @Accessors
accessors需要与@Data/@Setter/@Getter搭配一起使用 , 可以对生成的set/get方法做一些自定义配置
accessors有三个设置属性
3.10 其他注解
此外 , Lombok还提供了其他方便的注解 , 大家则需选用 , 或者到Lombok官方文档查看更详细的说明
@NonNull , 注解在属性上 , 产生一个关于该属性的非null检查 , 如果参数为null , 则抛出空指针异常
@Cleanup , 注解在变量前 , 确保该资源会被自动关闭 , 默认调用对象的close()方法 . 如果是其他关闭方法 , 可以通过@Cleanup("methodName")指定
@RequiredArgsConstructor , 注解在类上 , 为类中所有带有@NonNull注解和final修饰的属性提供一个构造方法
@Value , 注解在类上 , 自动将所有属性声明为final类型 , 生成所有属性的get方法 , 以及equals,hashCode , toString方法
@SneakyThrows , 注解在方法上 , 将方法中的代码用try/catch括起来 ,才catch中抛出异常, 可指定抛出异常的类型
@Synchronized , 注解在方法上 , 效果和synchronzied关键字相同 , 区别是锁对象不同
4.1 Lombok是插件还是依赖 ?
Lombok不仅仅是项目中需要依赖的一个jar包 , 它也需要搭配IDE插件来使用 . Lombok的jar包是因为编译期需要用它的注解 , 而插件主要用来在编译器编译时通过操作AST(抽象语法树 , JAVA所允许的)来改变class字节码生成 . 它不像spring或hibernate是运行时特性 , 而是编译时特性 . 在生成class文件之后 , 它会根据注解将所有的代码恢复成之前正常的样子 , 所以Lombok的依赖范围是编译期即可
4.2 为什么依赖了Lombok jar包还是不能用Lombok注解 ?
这是很多人会粗心遇到的问题 , 答案就是千万记得安装插件 , 原因如上 .
4.3 大部分注解后都有一个空的构造参数 , 这个是Lombok自动生成的吗 ?
在编译后的class文件中可以看到 , 即使未用到@NoArgsConstructor注解 , 也通常都会有一个空参数构造 . 但是请记住 , 这个构造方法时java本身提供的 , 而非Lombok生成的(这是一个很基础的知识 , 但在一篇文章中作者有些误导大家 , 所以提一下) . java会为每个类生成一个隐式的空参构造用以实例化 , 但是如果手动写了一个有参构造 , 则java不再提供默认的空参构造方法 .
另外 , fastjson或其他三方框架在使用时会用调用空构造方法 , 如果已经提供了有参构造 , 还需要额外提供一个空参构造 , 否则会无法正常解析内容 . 还望注意 .
4.4 为什么不建议用Lombok的其他注解 , 而只使用pojo和log的 ?
这就是Lombok引起争议的一个地方(参看知乎文章Java开发中用到的Lombok是什么) , 对代码的侵入性太强 , 如果不熟悉这个插件的话 , 增加了代码阅读的复杂度 . 在项目的后期维护工作开发人员往往不是一个 , 当接手项目的时候增加学习成本 . set/get可以一句话解释 , 但类似于try/catch的省略 , cleanup的资源释放等代码风格需要再理解 . 所以一般只用POJO之类的注解就行了 .
另外 , 如果是需要发布到其他地方开源的项目 , 尽量不要用Lombok , 否则别人拉源码时会一脸懵逼的 .
4.5 Lombok和JDK10一起使用的问题
由于最近在研究JDK10 , 所以个人项目中用到的JDK是这个 , 在做这篇教程的时候 , 就遇到一个很奇怪的问题 .
java.lang.ExceptionInInitializerError , 编译时一切正常 , 就是运行时出现这个异常 . 后来在国外的一个论坛中了解到 , 最新的Lombok最高支持JDK9(最新版本才支持 , 如果旧版本Lombok的话可能JDK9也会出现该问题) , 原因是因为部分语法可能不兼容 , 据我推测可能JDK10的局部类型推断关键字var和Lombok之中的var , val(是的 , JDK10之前就可以通过Lombok使用var关键字了)有矛盾 , 所以造成JVM无法正常运行 . 解决办法就是先不要用JDK10就行了