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优缺点

优点:

    1. 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
    2. 让代码变得简洁,不用过多的去关注相应的方法
    3. 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

    1. 不支持多种参数构造器的重载
    2. 虽然省去了手动创建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();

 

posted @ 2020-02-25 23:03  Erneste  阅读(1266)  评论(0编辑  收藏  举报