Lombok 是一个 Java 库,它通过注解的方式极大地简化了 Java 代码的编写。它自动生成通常需要手动编写的代码,如 getter 和 setter 方法、构造函数、toString 方法、equals 和 hashCode 方法等。Lombok 旨在减少模板代码的编写,让开发者能够更专注于业务逻辑。
Lombok 的主要特点:
减少模板代码:自动生成常用的方法,如 getter、setter、构造函数等,减少模板代码的编写。
提高生产力:通过减少重复代码,提高开发效率。
增强代码可读性:通过简洁的注解,使代码更加清晰易读。
与现有代码无缝集成:可以轻松地添加到现有的 Java 项目中,无需对现有代码进行大量修改。
支持多种构建工具:与 Maven、Gradle 等多种构建工具兼容。
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号 Solomon 肖哥弹架构获取更多精彩内容
历史热点文章
Lombok 工作流程图
Lombok 架构设计图
1. 基本注解
1.1 @Getter
为类中的每个字段生成公共 getter 方法。
public class User { @Getter private String name; @Getter private int age;
public void display() { System.out.println("Name: " + getName() + ", Age: " + getAge()); }}
复制代码
1.2 @Setter
为类中的每个字段生成公共 setter 方法。
public class User { @Setter private String name; @Setter private int age;
public void updateDetails(String newName, int newAge) { setName(newName); setAge(newAge); System.out.println("Updated Name: " + getName() + ", Age: " + getAge()); }}
复制代码
1.3 @ToString
为类生成 toString 方法。
public class User { @ToString private String name; @ToString private int age;
public void printUser() { System.out.println(this); }}
复制代码
1.4 @EqualsAndHashCode
为类生成 equals 和 hashCode 方法。
public class User { @EqualsAndHashCode private String name; @EqualsAndHashCode private int age;
public void checkEquality(User anotherUser) { if (this.equals(anotherUser)) { System.out.println("Users are equal."); } else { System.out.println("Users are not equal."); } }}
复制代码
1.5 @NoArgsConstructor
为类生成无参构造函数。
public class User { private String name; private int age;
@NoArgsConstructor public void createAndDisplay() { User user = new User(); System.out.println(user.getName() + " " + user.getAge()); }}
复制代码
1.6 @AllArgsConstructor
为类生成包含所有参数的构造函数。
public class User { private String name; private int age;
@AllArgsConstructor public void createWithAllArgsConstructor() { User user = new User("John Doe", 30); System.out.println(user); }}
复制代码
1.7 @RequiredArgsConstructor
为类生成包含所有 final 字段的构造函数。
public class User { private final String name; private final int age;
@RequiredArgsConstructor public void createWithRequiredArgsConstructor() { User user = new User("John Doe", 30); System.out.println(user); }}
复制代码
1.8 @Data
组合了 @Getter、@Setter、@RequiredArgsConstructor、@ToString 和 @EqualsAndHashCode。
public class User { private String name; private int age;
@Data public void manipulateUser() { User user = new User("John Doe", 30); user.setName("Jane Doe"); System.out.println(user); }}
复制代码
2. 构建器和不可变性
2.1 @Builder
为类生成一个 builder 模式的构建器。
public class User { private String name; private int age;
@Builder public void createUser() { User user = User.builder().name("John Doe").age(30).build(); System.out.println(user); }}
复制代码
2.2 @Value
为类生成不可变对象的实现,包括 final 字段和 @RequiredArgsConstructor、@Getter、@EqualsAndHashCode、@ToString。
public class User { @Value private final String name; @Value private final int age;
public void createUser() { User user = new User("John Doe", 30); System.out.println(user); }}
复制代码
2.3 @SuperBuilder
一个更强大的 builder 模式注解,支持继承和更复杂的场景。
public class User { private String name; private int age;
@SuperBuilder public void createUser() { User user = User.builder().name("John Doe").age(30).build(); System.out.println(user); }}
复制代码
3. 日志注解
3.1 @Log
为类生成日志对象,支持不同的日志框架。
public class User { private String name; private int age;
@Log public void logUser() { log.info("User created with name: " + name + " and age: " + age); }}
复制代码
3.2 @Slf4j
为类生成一个 SLF4J 日志对象。
public class User { private String name; private int age;
@Slf4j public void logUser() { log.info("User created with name: " + name + " and age: " + age); }}
复制代码
3.3 @CommonsLog
为类生成 Apache Commons Logging 日志对象。
public class User { private String name; private int age;
@CommonsLog public void logUser() { log.info("User created with name: " + name + " and age: " + age); }}
复制代码
3.4 @Log4j
为类生成 Log4j 日志对象。
public class User { private String name; private int age;
@Log4j public void logUser() { log.info("User created with name: " + name + " and age: " + age); }}
复制代码
3.5 @Log4j2
为类生成 Log4j2 日志对象。
public class User { private String name; private int age;
@Log4j2 public void logUser() { log.info("User created with name: " + name + " and age: " + age); }}
复制代码
3.6 @XSlf4j
为类生成一个 SLF4J 日志对象,但使用 XSlf4J 桥接。
public class User { private String name; private int age;
@XSlf4j public void logUser() { log.info("User created with name: " + name + " and age: " + age); }}
复制代码
4. 异常和同步
4.1 @SneakyThrows
允许方法抛出被声明的异常之外的异常。
public class User { private String name; private int age;
public void riskyOperation() { try { // Some risky operation that may throw an exception } catch (Exception e) { throw new RuntimeException("Failed operation", e); } }
@SneakyThrows public void performOperation() { riskyOperation(); }}
复制代码
4.2 @Synchronized
为方法添加同步锁。
public class User { private String name; private int age;
@Synchronized public void synchronizedMethod() { // Synchronized block of code System.out.println("Synchronized method execution"); }}
复制代码
5. 工具类和单例
5.1 @UtilityClass
标记一个工具类,防止实例化。
@UtilityClasspublic class Utility { public void utilityMethod() { System.out.println("This is a utility method."); }}
复制代码
5.2 @UtilityClassConstructor
阻止工具类的实例化。
@UtilityClassConstructorpublic class Utility { private Utility() { throw new AssertionError("Utility class should not be instantiated."); }
public void utilityMethod() { System.out.println("This is a utility method."); }}
复制代码
5.3 @Singleton
标记类为单例模式。
@Singletonpublic class User { private String name; private int age;
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
6. 委托和延迟加载
6.1 @Delegate
为类生成委托方法。
public class User { private SomeService service;
@Delegate public SomeService getService() { return service; }}
复制代码
6.2 @DelegateList
为类生成委托给列表的方法。
public class User { private List<String> names;
@DelegateList public List<String> getNames() { return names; }}
复制代码
6.3 @DelegateSet
为类生成委托给集合的方法。
public class User { private Set<String> roles;
@DelegateSet public Set<String> getRoles() { return roles; }}
复制代码
6.4 @DelegateMap
为类生成委托给映射的方法。
public class User { private Map<String, String> properties;
@DelegateMap public Map<String, String> getProperties() { return properties; }}
复制代码
6.5 @Getter(lazy = true)
生成延迟加载的 getter 方法。
public class User { private String name;
@Getter(lazy = true) private String getName() { return "Lazy " + name; }}
复制代码
7. 访问级别和空安全
7.1 @FieldDefaults
为类中的字段设置默认的访问级别。
@FieldDefaults(level = AccessLevel.PRIVATE)public class User { private String name; private int age;
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
7.2 @NonNull
标记字段或参数不应为 null。
public class User { @NonNull private String name; @NonNull private int age; public void validateUser() { if (name == null || age <= 0) { throw new IllegalArgumentException("Name and age must not be null or invalid"); } System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
7.3 @Nullable
标记字段或参数可以为 null。
public class User { @Nullable private String name; @Nullable private Integer age;
public void display() { System.out.println("Name: " + (name != null ? name : "Unknown") + ", Age: " + (age != null ? age : "Unknown")); }}
复制代码
7.4 @Final
标记字段为 final,但允许在初始化时赋值。
public class User { @Final private String name; @Final private int age;
public User(String name, int age) { this.name = name; this.age = age; }
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
7.5 @Setter(AccessLevel.NONE)
禁止为字段生成 setter 方法。
public class User { private String name; private int age;
@Setter(AccessLevel.NONE) public void setName(String name) { this.name = name; }
@Setter(AccessLevel.NONE) public void setAge(int age) { this.age = age; }
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
8. 其他
8.1 @Lazy
延迟初始化字段。
public class User { @Lazy private SomeService service;
public void useService() { service.performAction(); }}
复制代码
8.2 @Wither
为类中的每个字段生成带有 with 前缀的方法。
public class User { private String name; private int age;
@Wither public User withName(String name) { this.name = name; return this; }
@Wither public User withAge(int age) { this.age = age; return this; }
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
8.3 @Val
标记一个字段为局部变量,通常用于不可变对象。
public class User { @Val private final String name = "John Doe"; @Val private final int age = 30;
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
8.4 @RequiredArgsConstructor(AccessLevel.NONE)
为类生成一个私有的构造函数,防止外部实例化。
@RequiredArgsConstructor(AccessLevel.NONE)public class User { private final String name; private final int age;
public static User createUser(String name, int age) { return new User(name, age); }
public void display() { System.out.println("Name: " + name + ", Age: " + age); }}
复制代码
8. Lombok 综合应用案例
/** * 使用 Lombok 的@Slf4j 注解为类自动注入一个日志对象。 */@Slf4j/** * 使用 Lombok 的@Data 注解组合了 @ToString, @EqualsAndHashCode, @Getter, @Setter 和 @RequiredArgsConstructor。 * 这将为所有字段生成 getter 和 setter 方法,equals 和 hashCode 方法,以及 toString 方法。 */@Data/** * 使用 Lombok 的@RequiredArgsConstructor 注解生成一个包含所有 final 字段的构造函数。 * AccessLevel.PRIVATE 指定构造函数的访问级别为私有。 */@RequiredArgsConstructor(AccessLevel.PRIVATE)/** * 使用 Lombok 的@Builder 注解为类生成一个 Builder 模式的构建器。 */@Builderpublic class User {
/** * 使用 Lombok 的@Getter 注解为字段生成公共的 getter 方法。 */ @Getter /** * 使用 Lombok 的@NonNull 注解标记字段不应为 null。 */ @NonNull private final Long id;
/** * 使用 Lombok 的@Getter 和 @Setter 注解为字段生成公共的 getter 和 setter 方法。 */ @Getter @Setter /** * 使用 Lombok 的@NonNull 注解标记字段不应为 null。 */ @NonNull private String name;
/** * 使用 Lombok 的@Getter(lazy = true) 注解为字段生成延迟加载的 getter 方法。 */ @Getter(lazy = true) private final String email = "default@email.com";
/** * 使用 Lombok 的@ToString.Exclude 和 @EqualsAndHashCode.Exclude 注解在生成 toString 和 equals/hashCode 方法时排除字段。 */ @ToString.Exclude @EqualsAndHashCode.Exclude private transient String temporaryState;
/** * 使用 Lombok 的@NoArgsConstructor 注解为类生成一个无参构造函数。 */ @NoArgsConstructor /** * 使用 Lombok 的@AllArgsConstructor 注解为类生成一个包含所有参数的构造函数。 */ @AllArgsConstructor public User(String name, String email) { this.name = name; this.email = email; }
/** * 使用 Lombok 的@RequiredArgsConstructor 注解生成一个包含所有 final 字段的构造函数。 * AccessLevel.PACKAGE 指定构造函数的访问级别为包级私有。 */ @RequiredArgsConstructor(AccessLevel.PACKAGE) public User(Long id, String name) { this.id = id; this.name = name; }
/** * 使用 Lombok 的@With 注解为类中的每个字段生成带有 with 前缀的方法。 */ @With public User withName(String name) { return new User(this.id, name); }
/** * 使用 Lombok 的@ToString 注解为类生成 toString 方法。 */ @ToString /** * 使用 Lombok 的@Synchronized 注解为方法添加同步锁。 */ @Synchronized public void performAction() { log.info("Performing an action"); }
/** * 使用 Lombok 的@SneakyThrows 注解允许方法抛出被声明的异常之外的异常。 */ @SneakyThrows public void riskyAction() { throw new RuntimeException("Something went wrong"); }
/** * 使用 Lombok 的@Delegate 注解为类生成委托方法。 */ @Delegate private final UserService userService = new UserService();
/** * 使用 Lombok 的@DelegateList 注解为类生成委托给列表的方法。 */ @DelegateList private final List<String> roles = List.of("USER", "GUEST");
/** * 使用 Lombok 的@DelegateSet 注解为类生成委托给集合的方法。 */ @DelegateSet private final Set<String> permissions = Set.of("READ", "WRITE");
/** * 使用 Lombok 的@DelegateMap 注解为类生成委托给映射的方法。 */ @DelegateMap private final Map<String, String> properties = Map.of("key", "value");
/** * 使用 Lombok 的@Lazy 注解延迟初始化字段。 */ @Lazy private SomeExpensiveService expensiveService = new SomeExpensiveService();
/** * 使用 Lombok 的@FieldDefaults 注解为类中的字段设置默认的访问级别。 * level = AccessLevel.PRIVATE 指定字段的默认访问级别为私有。 */ @FieldDefaults(level = AccessLevel.PRIVATE) /** * 使用 Lombok 的@Getter(AccessLevel.PUBLIC) 注解为字段设置公共的访问级别。 */ @Getter(AccessLevel.PUBLIC) /** * 使用 Lombok 的@Setter(AccessLevel.NONE) 注解禁止为字段生成 setter 方法。 */ @Setter(AccessLevel.NONE) private LocalDateTime created = LocalDateTime.now();
/** * 使用 Lombok 的@FieldDefaults 注解为类中的字段设置默认的访问级别。 * level = AccessLevel.PRIVATE 指定字段的默认访问级别为私有。 */ @FieldDefaults(level = AccessLevel.PRIVATE) /** * 使用 Lombok 的@Getter(AccessLevel.PUBLIC) 注解为字段生成公共的 getter 方法。 */ @Getter(AccessLevel.PUBLIC) /** * 使用 Lombok 的@Setter(AccessLevel.NONE) 注解禁止为字段生成 setter 方法。 */ @Setter(AccessLevel.NONE) private String status = "ACTIVE";
public static void main(String[] args) { /** * 使用 Lombok 的@Builder 注解创建 User 对象。 */ User user = User.builder().id(1L).name("John Doe").email("john.doe@example.com").build(); user.displayUserInfo(); user.performAction(); user.riskyAction(); user.expensiveService.performExpensiveOperation(); }}
复制代码
评论