Idea / Eclipse中使用Lombok

Lombok 是一种 Java™ 实用工具 , 可用来帮助开发人员消除 Java 的冗长 . 尤其是对于简单的 Java 对象(POJO) . 它通过注解实现这一目的 . 如图所示 : 

使用Lombok前 : 


使用Lombok后 : 


并且使用Lombok相关方法的调用与平常并无差别 , 不用更改任何语法 . 


下面 , 让我们来看一下如何使用这个开发利器吧 . 

1 . 安装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项目

2 . pom中引入Lombok依赖

注意 : 依赖范围选择provided , 这也是官方建议 , Lombok在编译期会自动将所有java文件编译成正常的class

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.20</version>
	<scope>provided</scope>
</dependency>

3 . Lombok注解说明

注意 , 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 @Log / @Log4j / @Log4j2 / @Slf4j

注解到类上 , 提供一个属性名为log的日志对象 , private static final修饰 , 可以根据自己项目中的日志框架选择不同的注解


3.8@Accessors

accessors需要与@Data/@Setter/@Getter搭配一起使用 , 可以对生成的set/get方法做一些自定义配置

accessors有三个设置属性

  • prefix : 省略属性名中的前缀 , 例如pId属性 , 默认生成getPId() , 设置prefix = "p" , 则生成大的为getId() , 适用于属性名中包含一些前缀的类

  • chain : 如果设置为true , 生成的set方法将返回this而不是void , 通过这个配置我们可以像jQuery一样进行链式编程

  • fluent : 如果设置为true , 生成的set/get方法将不会使用bean标准的set/get/is进行前缀 , 而是直接用属性名命名


3.9 其他注解

此外 , 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 . Lombok常见问题说明

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就行了

猜你喜欢

转载自blog.csdn.net/xingbaozhen1210/article/details/80372272