Lombok.Data:用于简化 Java 类的开发

发布时间:2023-05-21

一、简介

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 等。