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
标记一个工具类,防止实例化。
@UtilityClass
public class Utility {
public void utilityMethod() {
System.out.println("This is a utility method.");
}
}
复制代码
5.2 @UtilityClassConstructor
阻止工具类的实例化。
@UtilityClassConstructor
public 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
标记类为单例模式。
@Singleton
public 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 模式的构建器。
*/
@Builder
public 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();
}
}
复制代码
评论