1 lombok是什么

Lombok通过注解简化和消除一些必须有但很臃肿冗余的Java代码(如setter,getter…)的工具,通过使用对应的注解,在编译源码时生成对应方法。官方地址:https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok。

lombok是一个IDE插件,也是一个项目需要依赖的jar包.lombok是依赖jar包的原因是因为编译时要用它的注解.是插件的原因是lombok要在编译时通过操作AST(abstract syntax tree.抽象语法树)改变字节码生成.也就是说可以改变java语法. 不像spring的依赖注入或者hibernate的orm一样是运行时的特性,lombok是编译时的特性.编译后的.class中lombok的注解被消除.

2 lombok能做什么

使用一个java对象,要写一些getter和setter方法,可能还要写一个构造器、equals方法、或者hash方法.这些方法很冗长而且没有技术含量,称之为样板代码(boilerplate code).lombok的主要作用是通过一些注解,消除样板代码.

比如Person.java,一个字段对应一个setter与getter,随之字段增多,代码长度快速增长.

public class Person {
    private int id;
    private String idCard;
    private String name;
    //0-female,1-male
    private int sex;
    private String address;
    private int age;
    private Date birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

如果使用lombok,如下,简单优雅.源代码更为简洁和更不容易产生错误。

@Data
public class PersonBean {
    private int id;
    private String idCard;
    private String name;
    //0-female,1-male
    private int sex;
    private String address;
    private int age;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date birthday;
}

可以看到,已经自动生成了getter/setter/equals/hashcode/toString等方法.如果觉得@Data注解简单粗暴,Lombok还提供一些更精细的注解,比如@Getter/@Setter(field注解),@ToString/@AllArgsConstructor(类注解).

3 Lombok使用

3.1 添加依赖

To set up lombok with any build tool, you have to specify that the lombok dependency is required to compile your source code, but does not need to be present when running/testing/jarring/otherwise deploying your code. Generally this is called a ‘provided’ dependency.

简单翻译下,需要指定lombok依赖才能编译源码,但是运行时,测试等阶段是不需要的,因此依赖范围为’provided’,

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

3.2 使用注解

在想用的地方加入注解,类或属性上

3.3 Lombok插件

为了在IDE中编写代码时不报错(找不到对应方法,编译问题),需要添加插件才能支持Lombok.搜索安装即可.安装后并重启IDE.

4 常用注解

@Getter / @Setter

可以作用在类和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。

@EqualsAndHashCode

默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。

@ToString

生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

@NoArgsConstructor,@RequiredArgsConstructor and @AllArgsConstructor

无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。

@Data

包含@ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,基本上使用这个注解就足够了

更多feature,参见官网.https://projectlombok.org/features/all

5 lombok问题

5.1 插件问题

需要安装插件,项目才能正常编译.当使用省略的方法时可能会标红(运行不会报错,因为 lombok 在编译时生成了这些代码,但编译前的 IDE 可不知道),因此需要配合 插件使用。不知道lombok的同学会不明所以.

某些IDE不支持lombok插件时,可以使用delombok.https://projectlombok.org/features/delombok

5.2 构造器重载

无法支持多种参数构造器的重载

5.3 debug

debug时可能不好打断点。Eclipse有解法,IntelliJ有workaround。据说都不是特别好。但是,断点打在Bean里…很多时候是没有必要的,除非你在Bean里写了特殊逻辑

由于lombok有上述一些问题,使用lombok存在一定争议.但对于新事物,应大胆尝试,批判使用.

留言

2018-02-01