Idea插件之——Lombok生成getter/setter等方法简化代码
Lombok实际上在我们项目的代码里早就统一使用了,用起来很方便,这几天在总结博客的Idea插件系列,今天总结一下Lombok。
一、Lombok是什么
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
二、Lombok优缺点
优点:
- 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
- 让代码变得简洁,不用过多的去关注相应的方法
- 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
- 不支持多种参数构造器的重载
- 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
三、Lombok原理
Lombok实现了JSR 269 API规范,javac在Java6开始支持这一规范,只要程序实现了该API,就能在javac运行的时候得到调用,那么Lombok在编译时使用的就是javac,具体流程如下:
首先是项目的源代码文件,在经过编译处理以后,lombok会使用自己的抽象语法树去进行注解的匹配,如果在项目中的某一个类中使用了lombok中的注解,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。执行顺序就如上图的叠放顺序。
四、Lombok常用注解
@Data注解:在JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor注解,即当使用当前注解时,会自动生成包含的所有方法;
@builder注解:在JavaBean中使用,使用此注解可通过builder方式初始化对象
@getter注解:在JavaBean中使用,使用此注解会生成对应的getter方法;
@setter注解:在JavaBean中使用,使用此注解会生成对应的setter方法;
@NoArgsConstructor注解:在JJavaBean中使用,使用此注解会生成对应的无参构造方法;
@AllArgsConstructor注解:在JJavaBean中使用,使用此注解会生成对应的有参构造方法;
@ToString注解:在JJavaBean中使用,使用此注解会自动重写对应的toStirng方法;
@EqualsAndHashCode注解:在JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;
@Slf4j:在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@Log4j:在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
五、Idea安装Lombok插件
点击File-- Settings--Plugins设置界面,安装Lombok插件:
点击File-- Settings--Build,Execution,Deployment设置界面,开启 AnnocationProcessors,开启该项是为了让Lombok注解在编译阶段起到作用。
六、Lombok使用方法
pom.xml中引入lombok依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
代码中推荐写法
@Data @NoArgsConstructor @Builder(toBuilder = true) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class UserInfo { private String name; @Builder.Default private String email = ""; } //@Builder注解赋值新对象 UserInfo userInfo = UserInfo.builder() .name("zzl") .email("bgood@sina.com") .build(); //@Builder注解修改原对象的属性值,要求实体上添加@Builder(toBuilder=true) userInfo = userInfo.toBuilder() .name("OK") .email("zgood@sina.com") .build();