02.《Lombok 实战 —— @Getter & @Setter 及 lombok.config》

x33g5p2x  于2021-12-25 转载在 其他  
字(4.9k)|赞(0)|评价(0)|浏览(291)

1. 简介

你可以使用@Getter@Setter注释任何字段,让lombok自动生成默认的getter/setter

2. @Getter@Setter简单使用

如果字段名为foo,则默认setter名为setFoo,返回void,并且该字段采用与该字段相同类型的1个参数进行赋值,如this.foo = foo

默认的getter只返回字段,如果字段名为foo,则命名为getFoo(如果字段的类型为boolean,则命名为isFoo),如下所示:

public class User {
    @Getter @Setter
    private String username;
    @Getter @Setter
    private Boolean isAdult;
    @Getter @Setter
    private boolean isYoungMan;
}

// 编译后:
public class User {
    private String username;
    private Boolean isAdult;
    private boolean isYoungMan;
    public User() { }

    public String getUsername() { return this.username; }
    public Boolean getIsAdult() { return this.isAdult; }
    public boolean isYoungMan() { return this.isYoungMan; }

    public void setUsername(String username) { this.username = username; }
    public void setIsAdult(Boolean isAdult) { this.isAdult = isAdult; }
    public void setYoungMan(boolean isYoungMan) { this.isYoungMan = isYoungMan; }
}

上面代码中,当我使用的是包装类型的Boolean生成的getter方法仍然是getIsAdult(),只有将实体类的属性数据类型定义为基本数据类型boolean时,lombok才会帮助我们生成isXoo()的格式,如isYoungMan()

你如果不想在每一个字段都添加@Getter@Setter,那么你还可以在类上放置@Getter@Setter注释。 在这种情况下,对该类中的所有非静态字段都添加getter & setter方法,如下所示:

@Getter
@Setter
public class User {
    private String username;
    private Boolean isAdult;
    private boolean isYoungMan;
}

采用在类上统一添加@Getter @Setter注解的方式,可以同样达到如上编译后的结果。

3. AccessLevel精确定义访问权限

除非你明确指定AccessLevel,否则生成的getter / setter方法将是public的。在Java中合法访问级别为PUBLICPROTECTEDPACKAGEPRIVATEAccessLevel是有一个枚举类型,主要定义访问权限,如下所示:

public enum AccessLevel {
	PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
	/** Represents not generating anything or the complete lack of a method. */
	NONE;
}

我们使用AccessLevel来定义方法的访问权限,可以有两种方式:

  • 在类上的@Getter @Setter中添加value = AccessLevel.PRIVATE,那么则会应用到类中的所有属性上;
  • 在属性上@Getter @Setter中添加value = AccessLevel.PRIVATE,那么会覆盖在类上添加的权限控制。
@Getter
@Setter(value = AccessLevel.PRIVATE)
public class User {
    @Setter(value = AccessLevel.PUBLIC)	// 测试在属性上定义会覆盖在类上的定义
    private String username;
    @Getter(value = AccessLevel.PRIVATE)
    private String password;
    private boolean isAdult;
}

// 编译后
public class User {
    private String username;
    private String password;
    private boolean isAdult;
    public User() { }

    public String getUsername() { return this.username; }
    private String getPassword() { return this.password; }
    public boolean isAdult() { return this.isAdult; }
    
    public void setUsername(String username) { this.username = username; }
    private void setPassword(String password) { this.password = password; }
    private void setAdult(boolean isAdult) { this.isAdult = isAdult; }
}

在类AccessLevel中你会看到AccessLevel.NONE,你可以使用AccessLevel.NONE来定义字段的访问级别,意思是采用手动方式禁止此字段的getter / setter生成。 这个操作可以覆盖类上的@Getter@Setter@Data注释的行为。

@Getter
@Setter(value = AccessLevel.PRIVATE)
public class User {
    private String username;
    @Getter(value = AccessLevel.NONE)
    private String password;
    private boolean isAdult;
}

// 编译后
public class User {
    private String username;
    private String password;
    private boolean isAdult;
    public User() { }

    public String getUsername() { return this.username; }
    public boolean isAdult() { return this.isAdult; }
    
    private void setUsername(String username) { this.username = username; }
    private void setPassword(String password) { this.password = password; }
    private void setAdult(boolean isAdult) { this.isAdult = isAdult; }
}

4. 在方法上添加注解

要在生成的方法上添加注释,可以使用onMethod = @__{@AnnotationsHere}; 要将注释放在生成的setter方法的唯一参数上,可以使用onParam = @__{@AnnotationsHere})

5. 配置文件定制Lombok

注:使用lombok.config定时lombok需要lombok 1.14+

我们可以使用配置文件lombok.config来定制Lombok,通过配置我们可以使用更使用的Lombok的功能,比如链式调用。

我们我可以将lombok.config的配置文件放到任意位置,lombok.config的作用范围是所在当前位置目录及子目录。
出于规范,建议放在根目录或者src目录下。

5.1 使用自定义配置文件

lombok.config中需要添加一项指明lombok根目录位置的配置:

config.stopBubbling = true

当使用了这个配置,lombok就会知道当前位置就是起作用的起始位置,其子目录都将会收到此配置文件的辐射作用。

如果在当前目录的子目录中还存在一个lombok.config配置文件,那么对于子目录中的的实体类会优先选择使用子目录中的配置,而当前目录(父目录)下的相同的的配置项会被子目录下的配置覆盖掉。

5.2 配置链式调用

在实际开发过程中,个人还是偏向使用链式调用,或者建造者模式,来构建对象,感觉就是爽!那么在lombok中仍然是可以使用一个配置,来打成链式调用的效果:

lombok.accessors.chain = [true | false] (default: false)
  • 定义配置文件
config.stopBubbling=true
lombok.accessors.chain=true

lombok.config 配置文件位置

  • 配置实体类
@Getter
@Setter
public class User {
    private String username;
    private String password;
    private boolean isAdult;
}

// 编译后:
public class User {
    private String username;
    private String password;
    private boolean isAdult;
    public User() { }
    public String getUsername() { return this.username; }
    public String getPassword() { return this.password; }
    public boolean isAdult() { return this.isAdult; }

    public User setUsername(String username) {
        this.username = username;
        return this;
    }

    public User setPassword(String password) {
        this.password = password;
        return this;
    }

    public User setAdult(boolean isAdult) {
        this.isAdult = isAdult;
        return this;
    }
}

// 测试链式调用:
public static void main(String[] args) {
    User user = new User();
    user.setUsername("jdkong").setPassword("jdkong").setAdult(true);
}
5.3 其他配置
# 禁止生成以 set/get/is 为前缀的方法,以字段名为方法名。
lombok.accessors.fluent = [true | false] (default: false)
# 在生成的get/set/is 方法名中,添加前缀(或去掉字段中的某些前缀),eg:getPerfixFoo(),
lombok.accessors.prefix += a field prefix (default: empty list)
# 禁止生成 is 为前缀的方法
lombok.getter.noIsPrefix = [true | false] (default: false)
# 禁止使用 @Setter
lombok.setter.flagUsage = [warning | error] (default: not set)
# 禁止使用 @Getter
lombok.getter.flagUsage = [warning | error] (default: not set)
# 复制可以使用的注解:e.g. @Nullable/@NonNull annotations
lombok.copyableAnnotations = [A list of fully qualified types] (default: empty list)

6. 参考文档

相关文章