一、简介
Lombok 是一个开源的 Java 库,可以自动化生成 Java 类的 getter、setter、equals、hashCode 等常用方法,减少了编写样板式代码的工作量,提高开发效率。Lombok.Data 是 Lombok 中的一个注解,可以自动在类上生成 getter、setter、equals、hashCode 和 toString 方法。
二、@Data 注解的使用
要使用 Lombok.Data 需要在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
在 Java 类上添加 @Data
注解即可自动生成 getter、setter、equals、hashCode 和 toString 方法。
import lombok.Data;
@Data
public class User {
private int id;
private String name;
}
以上代码会自动生成以下方法:
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
三、@Data 注解的特点
1. 链式调用
通过在属性上使用 @Setter
和 @Accessors
注解,可以实现链式调用。使用 @Setter(chain = true)
开启链式调用,@Accessors(chain = true)
控制链式调用的相关行为。
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class User {
private int id;
private String name;
}
// 使用
User user = new User().setId(1).setName("Tom");
2. 默认构造函数
在类上添加 @Data
注解,就会默认生成一个无参构造函数。
@Data
public class User {
private int id;
private String name;
public User(){}
}
3. 全参构造函数
在类上添加 @AllArgsConstructor
注解,就会自动生成一个包含所有参数的构造函数。
@Data
@AllArgsConstructor
public class User {
private int id;
private String name;
}
4. 静态方法
在类上添加 @Data(staticConstructor = "of")
注解,就会自动生成一个以参数为输入的静态工厂方法。此方法的名称可以在注解中指定。
@Data(staticConstructor = "of")
public class User {
private int id;
private String name;
}
// 使用
User user = User.of(1, "Tom");
四、@Data 注解的局限性
虽然 @Data
注解可以大大减少样板代码,但是也有它的局限性。下面是几个 @Data
注解的局限性:
1. 不能控制生成方法的可见性
@Data
注解会将所有属性的访问级别设置为 public,不能控制生成方法的可见性。
@Data
public class User {
private int id;
private String name;
}
// 生成结果如下(getter 和 setter 方法都是 public 的):
public int getId() {...}
public void setId(int id) {...}
public String getName() {...}
public void setName(String name) {...}
2. 相同名称的属性会出现名称冲突问题
如果有两个属性的名称相同,@Data
注解会将它们的 getter 和 setter 方法的名称都设置为相同的名称,会出现名称冲突问题。
@Data
public class User {
private int id;
private String name;
private String email;
}
// 生成结果如下(name 的 getter 和 setter 方法和 email 的 getter 和 setter 方法名字是相同的):
public String getName() {...}
public void setName(String name) {...}
public String getEmail() {...}
public void setEmail(String email) {...}
3. 不能自定义 equals 和 hashCode 方法的具体实现
@Data
注解生成的 equals 和 hashCode 方法是基于所有属性的默认实现,不能自定义它们的具体实现。
五、总结
Lombok.Data 可以大大减少样板代码的编写,提高开发效率。但是它也有它的局限性,需要根据具体情况进行选择。在实际开发中,可以根据具体需要使用 Lombok 的其他注解来解决上述问题。例如 @Getter
、@Setter
、@ToString
、@EqualsAndHashCode
等。