1.概述

有时,我们希望隐藏对象中获取或设置字段值的能力。然而,Lombok会自动为这些字段生成默认的getter和setter方法。在这篇简短教程中,我们将展示如何在Lombok中禁用特定字段的getter和setter生成。有关Project Lombok库的详细介绍,请参阅Project Lombok库入门

在继续之前,请确保在IDE中安装Lombok插件

2.依赖项

首先,我们需要将Lombok添加到我们的pom.xml文件中:

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

3.默认行为

在深入探讨如何禁用getter和setter生成之前,让我们先回顾一下生成它们的注解的默认行为。

3.1. @Getter@Setter 注解

Lombok提供了两个访问器注解,@Getter@Setter。我们可以为每个字段进行注解,也可以直接为整个类标记。生成的方法默认为public。但是,我们可以将其更改为protected、包级或private。下面是一个示例:

@Setter
@Getter
public class User {
    private long id;
    private String login;
    private int age;
}

使用IDE中的delombok选项查看Lombok生成的代码:

public class User {
    private long id;
    private String login;
    private int age;

    public long getId() {
        return this.id;
    }

    public String getLogin() {
        return this.login;
    }

    public int getAge() {
        return this.age;
    }

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

    public void setLogin(String login) {
        this.login = login;
    }

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

如我们所见,所有getter和setter都已创建。所有字段的getter和setter都是public,因为我们没有在任何字段上显式指定访问级别。

3.2. @Data 注解

@Data结合了其他几个注解的功能,包括@Getter@Setter。因此,在这种情况下,默认的访问器方法也会被生成为public

@Data
public class Employee {
    private String name;
    private String workplace;
    private int workLength;
}

4. 使用 AccessLevel.NONE 禁用特定字段的getter或setter

要禁用特定字段的默认getter和setter生成,我们应该使用特定的访问级别:

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)

这个访问级别允许我们在类的@Getter@Setter@Data注解上覆盖行为。要覆盖访问级别,可以为字段或类添加明确的@Setter@Getter注解。

4.1. 覆盖 @Getter@Setter 注解

让我们将age字段的getter和id字段的setter的访问级别改为NONE

@Getter
@Setter
public class User {
    @Setter(AccessLevel.NONE)
    private  long id;
    
    private String login;
    
    @Getter(AccessLevel.NONE)
    private int age;
}

查看delombok后的代码:

public class User {
    private  long id;

    private String login;

    private int age;

    public long getId() {
        return this.id;
    }

    public String getLogin() {
        return this.login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

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

如我们所见,id字段没有setter,而age字段没有getter。

4.2. 覆盖 @Data 注解

接下来,看一个例子,我们将类的@Data注解的访问级别改为NONE

@Data
public class Employee {

    @Setter(AccessLevel.NONE)
    private String name;

    private String workplace;
    
    @Getter(AccessLevel.NONE)
    private int workLength;
}

我们为workLength字段添加了明确的@Getter注解,为name字段添加了明确的@Setter注解,并将这两个访问器的访问级别设置为NONE。让我们看看delombok后的代码:

public class Employee {

    private String name;

    private String workplace;

    private int workLength;
    
    public String getName() {
        return this.name;
    }

    public String getWorkplace() {
        return this.workplace;
    }

    public void setWorkplace(String workplace) {
        this.workplace = workplace;
    }

    public void setWorkLength(int workLength) {
        this.workLength = workLength;
    }
}

正如预期的那样,我们对@Getter@Setter的明确设置覆盖了由@Data注解生成的getter和setter。name字段没有生成setter,而workLength字段没有生成getter。

5. 结论

在这篇文章中,我们探讨了如何通过Lombok为对象中的特定字段禁用getter和setter生成。此外,我们还展示了@Getter@Setter@Data注解的例子。最后,我们看到了Lombok为我们设置的注解生成的代码。

如往常一样,代码可在GitHub上找到。