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上找到。