public class A { private int a; private String b; public int getA() { return a; } public String getB() { return b; } public void setA(int a) { this.a = a; } public void setB(String b) { this.b = b; } }
对于这样一个简单的 Java 类,咱们一般须要给每一个属性写getter
和setter
,而这种实际上没有什么太大的意义。固然,若是有的公司或团队使用代码行数评估工做量,仍是多写几行吧;同时,能够考虑一下咱们团队。java
为了简化getter
与setter
,lombok 提供了一种机制,帮助咱们自动生成这些样板代码。以上的代码,若是使用lombok
的话,将变得很简单:git
@lombok.Getter @lombok.Setter public class A { private int a; private String b; }
顾名思义,lombok.Getter
就是生成getter
,lombok.Setter
就是生成setter
。可是,这样真的就能够了么?编译下,让咱们看看生成的二进制代码。(请自行下载lombok.jar
)github
命令行> javac -cp lombok.jar A.java 命令行> javap -c A.class
输出结果略。能够看到彻底同样。eclipse
更进一步,若是在编译的时候,加入-g:none
选项,甚至能够看到生成的文件彻底同样。maven
虽然咱们能够在编译的时候,加入classpath
,可是,通常来讲,在各种IDE
中使用,仍是须要特殊处理一下。ide
加上依赖就好。同时,因为lombok
只在编译期才处理,因此并不须要在运行时有这个依赖,能够把scope
定义为provided
。工具
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> <scope>provided</scope> </dependency> </dependencies>
值得注意的是,maven
的maven-compiler-plugin
低版本和lombok
高版本不兼容,目前已知maven-compiler-plugin
的2.3.X
与lombok
的1.6.X
不兼容。这个须要了解lombok
的原理才能进一步说明。ui
因为eclipse
的默认编译器并非javac
,因此,须要额外安装,基本就是改下引导参数,能够直接运行jar
包,或者手动在eclipse.ini
里加上参数-Xbootclasspath/a:lombok.jar -javaagent:lombok.jar
。this
虽然IDEA IntelliJ
默认使用javac
做为编译器,理论上能够不装插件。但是,跳转等特性也随之没了。因此,仍是安装个插件吧,直接去仓库里搜索lombok
就成。spa
若是项目中使用高级配置,须要额外注意一下。虽然在编译的时候,lombok
配置文件能够在任何能找到的目录,可是,lombok-intellij
插件默认并不支持在任何目录,若是有配置文件,建议放在java
的源代码根目录中。
lombok 目前最新版本为 1.16.8,我的以为比较经常使用的有如下几种,更多请查看官网。
@val
若是你要定义一个final
的变量,而且不想写类型,这个能够帮到你。可是,在实际项目中,彻底没有使用到。
@NonNull
这个在参数中使用,若是调用时传了null
,就直接抛空指针。
@Data
@ToString
、@EqualsAndHashCode
、@Getter
、@Setter
和@RequiredArgsConstructor
注解的集合。
@Getter
与@Setter
做用于属性和类上,自动生成属性的getXXX()
和setXXX()
方法。若在类上,则对全部属性有效。并可经过AccessLevel
参数控制方法的访问级别。
@ToString
做用于类,自动重写类的ToString()
方法。经常使用的参数有exclude
(指定方法中不包含的属性)、callSuper
(方法中是否包含父类ToString()
方法返回的值)
@EqualsAndHashCode
做用于类,自动重写类的equals()
、hashCode()
方法。经常使用的参数有exclude
(指定方法中不包含的属性)、callSuper
(方法中是否包含父类ToString()
方法返回的值)
@NoArgsConstructor
, @RequiredArgsConstructor
和@AllArgsConstructor
做用于类,@NoArgsConstructor
自动生成不带参数的构造方法;@RequiredArgsConstructor
自动生成带参数的构造方法,主要针对一些须要特殊处理的属性,好比未初始化的final
属性;@AllArgsConstructor
自动生成包含全部属性的构造方法。
@Synchronized
做用于方法,可锁定指定的对象,若是不指定,则默认建立建立一个对象锁定。
@Log
,或者直接@Slf4j
做用于类,具体包含@CommonsLog
、@Log
、@Log4j
、@Log4j2
、@Slf4j
和@XSlf4j
,分别对用不一样的日志系统。利用此类注解,可为类建立一个log
属性。
sonar
源码审查sonar
是一个源码审查工具。最新版5.X
已经支持lombok
的所有注解,再也不认为是没有使用的变量。可是,旧的4.X
仍是认为没有使用这些变量。能够后向移植这些包,或者应用单独的补丁。
呃,真的有人想看原理么?若是想,请留言,之后再发。
lombok, lombok 官网,可是,目前没有发现哪里能够捐赠
sonar, sonar 官网,对代码规范有一些建议
sonar-java, sonar-java 低版本插件,支持lombok