Loading... # Lombok常用注解详解 **Lombok** 是一个用于简化 Java 开发的库,通过在编译时自动生成一些冗余代码,如 getter、setter、构造方法、`equals()` 和 `hashCode()` 等方法,显著减少了样板代码的书写,提升了代码的简洁性和可读性。Lombok 主要通过注解来实现这些功能,开发者可以在代码中直接使用注解来生成对应的代码逻辑。 本文将详细介绍 Lombok 中常用的注解,并结合代码实例进行说明,帮助开发者高效掌握其使用。 ## 目录 1. [Lombok 常用注解总览](#Lombok-常用注解总览) 2. [@Getter 和 @Setter](#Getter-和-Setter) 3. [@ToString](#ToString) 4. [@EqualsAndHashCode](#EqualsAndHashCode) 5. [@NoArgsConstructor 和 @AllArgsConstructor](#NoArgsConstructor-和-AllArgsConstructor) 6. [@Builder](#Builder) 7. [@Data](#Data) 8. [@Value](#Value) 9. [@Slf4j](#Slf4j) 10. [最佳实践](#最佳实践) 11. [总结](#总结) 12. [附录](#附录) ## Lombok 常用注解总览 Lombok 提供了多种注解,简化了常见的 Java 类操作,以下是一些常用注解: | **注解** | **功能** | | ----------------------- | --------------------------------------------------------------------------------- | | `@Getter` | 自动生成 getter 方法 | | `@Setter` | 自动生成 setter 方法 | | `@ToString` | 自动生成 `toString()` 方法 | | `@EqualsAndHashCode` | 自动生成 `equals()` 和 `hashCode()` 方法 | | `@NoArgsConstructor` | 自动生成无参构造方法 | | `@AllArgsConstructor` | 自动生成包含所有字段的全参构造方法 | | `@Builder` | 生成 Builder 模式的类 | | `@Data` | 综合注解,包含 `@Getter`、`@Setter`、`@ToString`、`@EqualsAndHashCode` 等 | | `@Value` | 用于不可变对象,类似于 `@Data`,但字段为 `final` | | `@Slf4j` | 自动生成 `Slf4j` 日志记录器 | ## @Getter 和 @Setter `@Getter` 和 `@Setter` 是最常用的 Lombok 注解,用于自动生成 Java 类中字段的 getter 和 setter 方法,避免手动编写。 ### 示例代码: ```java import lombok.Getter; import lombok.Setter; public class User { @Getter @Setter private String name; @Getter @Setter private int age; } ``` **解释**: - `@Getter` 注解自动生成 `getName()` 和 `getAge()` 方法。 - `@Setter` 注解自动生成 `setName(String name)` 和 `setAge(int age)` 方法。 ### 指定访问级别: 你还可以指定 getter 和 setter 方法的访问级别: ```java @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PROTECTED) private String email; ``` **解释**:`getEmail()` 方法是 public 级别的,而 `setEmail()` 方法是 protected 级别的。 ## @ToString `@ToString` 注解会自动生成 `toString()` 方法,帮助我们在调试和日志记录时更方便地查看对象的字段信息。 ### 示例代码: ```java import lombok.ToString; @ToString public class User { private String name; private int age; } ``` **解释**: - Lombok 会为 `User` 类自动生成如下的 `toString()` 方法: ```java @Override public String toString() { return "User(name=" + this.name + ", age=" + this.age + ")"; } ``` ### Exclude 排除字段: 有时候我们不希望所有字段都出现在 `toString()` 方法中,这时可以使用 `@ToString.Exclude` 来排除特定字段。 ```java @ToString public class User { private String name; @ToString.Exclude private String password; } ``` **解释**:`password` 字段不会出现在生成的 `toString()` 方法中。 ## @EqualsAndHashCode `@EqualsAndHashCode` 注解会自动生成 `equals()` 和 `hashCode()` 方法,用于对象的比较操作。这在集合操作中尤为重要,比如在 `HashSet`、`HashMap` 中使用对象时,`equals()` 和 `hashCode()` 方法必须保持一致。 ### 示例代码: ```java import lombok.EqualsAndHashCode; @EqualsAndHashCode public class User { private String name; private int age; } ``` **解释**: - Lombok 自动生成基于所有字段的 `equals()` 和 `hashCode()` 方法。 ### Exclude 排除字段: 同样,`@EqualsAndHashCode.Exclude` 可用于排除特定字段。 ```java @EqualsAndHashCode public class User { private String name; @EqualsAndHashCode.Exclude private int age; } ``` **解释**:`age` 字段将不参与 `equals()` 和 `hashCode()` 方法的生成。 ## @NoArgsConstructor 和 @AllArgsConstructor 这两个注解分别用于自动生成无参构造方法和全参构造方法。 ### @NoArgsConstructor 示例: ```java import lombok.NoArgsConstructor; @NoArgsConstructor public class User { private String name; private int age; } ``` **解释**:自动生成无参构造函数 `User()`。 ### @AllArgsConstructor 示例: ```java import lombok.AllArgsConstructor; @AllArgsConstructor public class User { private String name; private int age; } ``` **解释**:自动生成全参构造函数 `User(String name, int age)`。 ## @Builder `@Builder` 注解用于生成 Builder 模式的类,提供链式调用来创建复杂对象。 ### 示例代码: ```java import lombok.Builder; @Builder public class User { private String name; private int age; } ``` **使用方法**: ```java User user = User.builder() .name("Alice") .age(25) .build(); ``` **解释**: - `@Builder` 注解会为类生成一个静态的 `builder()` 方法,提供链式调用来设置属性,最后通过 `build()` 方法构建对象。 ## @Data `@Data` 是一个综合注解,包含 `@Getter`、`@Setter`、`@ToString`、`@EqualsAndHashCode` 和 `@RequiredArgsConstructor`(包含 `final` 字段的构造方法),通常用于快速定义基本的 Java Bean 类。 ### 示例代码: ```java import lombok.Data; @Data public class User { private String name; private int age; } ``` **解释**:`@Data` 自动为所有字段生成 getter、setter、`toString()`、`equals()`、`hashCode()` 和构造方法。 ## @Value `@Value` 注解用于定义不可变对象(类似于 `@Data`,但所有字段都为 `final`,并且不生成 setter 方法)。 ### 示例代码: ```java import lombok.Value; @Value public class User { String name; int age; } ``` **解释**: - 所有字段都为 `final`,生成带参构造函数,不会生成 setter 方法,确保对象的不可变性。 ## @Slf4j `@Slf4j` 注解用于自动生成 `Slf4j` 日志记录器,简化日志的使用。 ### 示例代码: ```java import lombok.extern.slf4j.Slf4j; @Slf4j public class UserService { public void createUser() { log.info("Creating a new user"); } } ``` **解释**:`@Slf4j` 注解自动生成 `private static final org.slf4j.Logger log` 字段,供日志记录使用。 ## 最佳实践 1. **合理使用注解**:Lombok 注解虽然可以减少样板代码,但过度使用可能会让类的行为变得不明确,建议根据需要使用特定注解。 2. **使用 `@Data` 或 `@Value` 时注意隐式生成的方法**:如果不需要所有方法(如 `equals()` 或 `toString()`),可以使用更细粒度的注解(如 `@Getter`、`@Setter` 等)。 3. **调试与阅读代码**:Lombok 自动生成的代码在源码中不可见,调试时可以通过 IDE 的反编译功能查看生成的代码。 4. **结合项目规范使用**:在团队协作开发中,使用 Lombok 时需要确保团队成员对其有足够的了解,避免因误解引发代码问题。 ## 总结 Lombok 是一个非常实用的库,能够显著减少 Java 开发中的样板代码。通过自动生成 getter 、setter、构造方法、`equals()`、`hashCode()`、日志器等常用代码,Lombok 提升了开发效率。本文详细介绍了 Lombok 的常用注解及其应用场景,并结合代码示例进行了说明。开发者可以根据项目需求,合理选择和使用 Lombok 注解,确保代码的简洁性和可维护性。 ## 附录 ### Lombok 注解汇总表 | **注解** | **功能** | **示例** | | ----------------------- | -------------------------------------------- | -------------------------------- | | `@Getter` | 自动生成 getter 方法 | `@Getter private String name;` | | `@Setter` | 自动生成 setter 方法 | `@Setter private int age;` | | `@ToString` | 自动生成 `toString()` 方法 | `@ToString` | | `@EqualsAndHashCode` | 自动生成 `equals()` 和 `hashCode()` | `@EqualsAndHashCode` | | `@NoArgsConstructor` | 自动生成无参构造方法 | `@NoArgsConstructor` | | `@AllArgsConstructor` | 自动生成全参构造方法 | `@AllArgsConstructor` | | `@Builder` | 生成 Builder 模式的类 | `@Builder` | | `@Data` | 综合注解,生成常用代码 | `@Data` | | `@Value` | 不可变对象,类似 `@Data`,字段为 `final` | `@Value` | | `@Slf4j` | 自动生成 Slf4j 日志记录器 | `@Slf4j` | 通过本文的详细介绍,开发者能够对 Lombok 的常用注解有清晰的认识,并在日常开发中高效使用这些注解,提升代码质量和开发效率。 最后修改:2024 年 09 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏