Lombok 常用方法实例

文章以一个方法一个代码块的方式演示.

简单几个注解

  • set和get方法
    @Getter / @Setter

  • toString方法
    @ToString

  • equals和hashCode方法
    @EqualsAndHashCode

  • Data
    @Data 通常这个方法就够了, 包含上面几个注解.

  • 全参, 无参
    @AllArgsConstructor, @NoArgsConstructor

  • 不能为空
    @NonNull, 作用到属性上是, 如果不赋值会抛空指针

  • 日志
    @Slf4j

链式调用

通过设置 @Accessorschain=true

public class LombokTest {
    public static void main(String[] args) {

        Student student = new Student();
        
        student.setName("yzt").setAge(22);
    }
}

@Data
@Accessors(chain = true)
class Student {
    private String name;
    private Integer age;
}

静态方法构造器

通过 @NonNull@RequiredArgsConstructor(staticName = "ofName") 实现.
name 属性上添加 @NonNull 注解标识不能为空, 然后通过 RequiredArgsConstructorstaticName 属性设置静态构造器的名称.
当然也是可以不使用 @NonNull 属性的, 标识静态构造器是 空参

带参数的构造
public class LombokTest {
    public static void main(String[] args) {

        Student student = Student.ofName("yzt").setAge(22);
        System.out.println(student);
    }
}

@Data
@Accessors(chain = true)
@RequiredArgsConstructor(staticName = "ofName")
class Student {
    @NonNull
    private String name;
    private Integer age;
}

空参构造
public class LombokTest {
    public static void main(String[] args) {

        Student student = Student.of().setName("yzt").setAge(22);
        System.out.println(student);
    }
}

@Data
@Accessors(chain = true)
@RequiredArgsConstructor(staticName = "of")
class Student {
    private String name;
    private Integer age;
}

builder 模式

public class LombokTest {
    public static void main(String[] args) {

        Student student = Student.builder().name("yzt").age(22).build();
        System.out.println(student);
    }
}

@Data
@Builder
class Student {
    private String name;
    private Integer age;
}

工具类

@UtilityClass 注解作用在工具方法上, 会私有构造, 然后为方法添加 static 关键字. 注意下方我演示的 getIp() 方法没有添加 static 关键字也能够调用.

public class LombokTest {
    public static void main(String[] args) {

        String ip = HttpKit.getIp();
        System.out.println(ip);
    }
}

@UtilityClass
class HttpKit {

    public String getIp() {
        return "127.0.0.1";
    }
}

去除统一前缀

这个在使用的时候命名一定要使用 驼峰命名法, 不然会出现莫名其妙的问题.

public class LombokTest {
    public static void main(String[] args) {

        Student student = new Student();
        student.setName("yzt");
        student.setAge(22);
        System.out.println(student);
    }
}

@Data
@Accessors(prefix = "f")
class Student {
    private String fName;
    private Integer fAge;
}

set/get 方法不以 set/get 开头

就相当于去掉了 set/get 前缀的 set/get 方法. 不推荐使用. 不符合Java规范.

public class LombokTest {
    public static void main(String[] args) {

        Student student = new Student();
        student.name("yzt");
        student.age(22);
        System.out.println(student.name());
    }
}

@Data
@Accessors(fluent = true)
class Student {
    private String name;
    private Integer age;
}

代理方法

这个说起来有点懵逼, 直接看代码可能更清晰.

public class LombokTest {
    public static void main(String[] args) {

        User user = new User();
        user.add("yzt");    // 这里其实调用的是 TemplateCollection 的方法
        user.add("xxx");
        user.add("yyy");
        System.out.println(user);
        user.remove("yyy");
        System.out.println(user);
    }
}

@ToString
class User {
    private interface TemplateCollection {
        boolean add(String obj);
        boolean remove(Object obj);
    }

    @Delegate(types = TemplateCollection.class)
    private final Collection<String> users = new ArrayList<>();
}

输出: 
User(users=[yzt, xxx, yyy])
User(users=[yzt, xxx])

后记

编译注解到代码

通过菜单栏的 Refactor -> delombok 就可以得到源代码了

关于lombok

lombok.experimental.* 包下的是创新型注解. 与Java规范不符合, 有待考证
lombok.* 包下的放心使用.