一、简介
Lombok 是一个开源的 Java 库,可以自动化生成 Java 类的 getter、setter、equals、hashCode 等常用方法,减少了编写样板式代码的工作量,提高开发效率。Lombok.Data 是 Lombok 中的一个注解,可以自动在类上生成 getter、setter、equals、hashCode 和 toString 方法。
二、@Data 注解的使用
要使用 Lombok.Data 需要在 pom.xml 文件中添加以下依赖:
{@code org.projectlombok lombok 1.18.16 provided }
在 Java 类上添加 @Data 注解即可自动生成 getter、setter、equals、hashCode 和 toString 方法。
{@code import lombok.Data; @Data public class User { private int id; private String name; } }
以上代码会自动生成以下方法:
{@code 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) 控制链式调用的相关行为。
{@code 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 注解,就会默认生成一个无参构造函数。
{@code @Data public class User { private int id; private String name; public User(){} } }
3. 全参构造函数
在类上添加 @AllArgsConstructor 注解,就会自动生成一个包含所有参数的构造函数。
{@code @Data @AllArgsConstructor public class User { private int id; private String name; } }
4. 静态方法
在类上添加 @Data(staticConstructor = “of”) 注解,就会自动生成一个以参数为输入的静态工厂方法。此方法的名称可以在注解中指定。
{@code @Data(staticConstructor = "of") public class User { private int id; private String name; } // 使用 User user = User.of(1, "Tom"); }
四、@Data 注解的局限性
虽然 @Data 注解可以大大减少样板代码,但是也有它的局限性。下面是几个 @Data 注解的局限性:
1. 不能控制生成方法的可见性
@Data 注解会将所有属性的访问级别设置为 public,不能控制生成方法的可见性。
{@code @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 方法的名称都设置为相同的名称,会出现名称冲突问题。
{@code @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 等。
原创文章,作者:AZKDE,如若转载,请注明出处:https://www.506064.com/n/368138.html