一个在编译阶段修改加强Java类的工具,使用方式基于注解,经常使用于:java
项目中是否引入Lombok一直是个存在争议,它的主要优点在于消除Java类的部分臃肿代码,提升开发效率,下降代码维护成本;缺点是须要IDE插件支持,须要团队统一规范,另外某些注解生成的隐性实现可能致使问题跟踪调试困难。git
不使用Lombok,IDE也能够自动生成getter,setter代码,但Lombok除了getter,setter还有@Builder和@SuperBuilder等很是实用的自动实现。好比你能够将一个POJO类转化为builder模式,若是你又有一个子类,子类的构造器还要继承自父类,写起来就费劲了。而经过Lombok只须要一个@SuperBuilder注解(v1.18.2+版本支持)。github
compile("org.projectlombok:lombok:1.18.4")
示例代码:框架
public class Parent { // get,set添加在指定属性上 @Getter @Setter private int id; @Getter @Setter private String name; }
在类上添加的注解:函数
- @Data 注解组合,含@Setter、@Getter、@RequiredArgsConstructor、@EqualsAndHashCode等注解 - 构造函数注解: @NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor - 构造器builder注解: @Builder、@SuperBuilder - 日志声明的注解: @Slf4j 等
示例代码:工具
@Data public class Child extends Parent { private String ext; }
@Setter@Getter或@Data注解添加后能够经过new建立对象并调用getter,setter方法:gradle
Child c1 = new Child(); c1.setId(1); System.out.println(c1.getId());
构造模式的链式调用写起来很方便,本身实现构造模式要在POJO类中写较多代码,尤为是须要继承父类的builder时。
Lombok的@Builder注解能够方便的支持构造模式
示例代码:ui
@Builder public class Child extends Parent { private String ext; }
调用方法:spa
Child c1 = Child.builder().ext("子类属性ext").build(); System.out.println(c1.getExt());
此例中的链式调用仅有ext()属性,即便给父类Parent也添加@Builder注解也依然不能链式调用id()和name(),本身去写builder的实现也是这样,类是继承的,但类中的builder并没有继承关系,而实际开发场景中咱们通常都须要让子类的builder继承父类builder的行为。插件
Lombok在v1.18.2版本中针对这个问题增长了@SuperBuilder注解,子类和父类中都添加@SuperBuilder注解,子类builder便可继承父类builder。
代码示例:
@SuperBuilder public class Parent { // get,set添加在指定属性上 @Getter @Setter private int id; //若是须要让build出的对象属性使用默认值,须要添加@Builder.Default注解 @Builder.Default @Getter @Setter private String name = "unknown"; } @SuperBuilder @Data public class Child extends Parent { private String ext; }
调用示例:
Child c1 = Child.builder().id(1).name("名称").ext("子类属性ext").build(); System.out.println(c1.getId());
须要注意的是: 关于builder的继承,Lombok Plugin还没有更新支持@SuperBuilder,因此以上写法在IDE下还会提示编译错误,等更新吧,或者用稍微蹩脚一点的解决方案:Lombok’s @Builder annotation and inheritance