Lombok库相关注解及用法
Lombok库相关注解及用法
Lombok 是一个 Java 工具库,通过注解自动生成常见的样板代码(如
getter/setter、toString、构造函数等),从而减少代码量并提升开发效率。
但也存在相应风险:
- 代码可读性:过度使用
@Data可能隐藏字段细节,需谨慎处理敏感字段(如密码)。- 调试问题:使用
@Data生成的toString()可能包含敏感信息,需注意日志安全。
一、使用方法
依赖添加:
- 在
pom.xml中添加依赖:<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> <scope>provided</scope> </dependency> - 安装 IntelliJ IDEA 或 Eclipse 的 Lombok 插件。
注解组合:
- 可通过组合注解实现复杂需求,例如:
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class User { ... }
二、基础注解
1. @Data
- 作用:自动生成以下方法:
getter和settertoString()equals()和hashCode()is*()方法(针对布尔类型字段)
- 示例:
@Data public class User { private String name; private int age; } - 适用场景:快速为 POJO(Plain Old Java Object)生成所有常用方法。
2. @Getter 和 @Setter
- 作用:单独生成
getter或setter方法。 - 示例:
@Getter @Setter public class User { private String name; private int age; }
3. @ToString
- 作用:生成
toString()方法,默认包含所有字段。 - 参数:
includeFieldNames:是否包含字段名(默认true)。callSuper:是否调用父类的toString()。of:指定类名(如@ToString(of = {"name", "age"}))。
- 示例:
@ToString(exclude = "password") // 排除 password 字段 public class User { private String name; private String password; }
4. @EqualsAndHashCode
- 作用:生成
equals()和hashCode()方法。 - 参数:
callSuper:是否调用父类的equals()和hashCode()。of:指定参与比较的字段。exclude:排除某些字段。
- 示例:
@EqualsAndHashCode(exclude = "id") public class User { private Long id; private String name; }
5. @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
- 作用:生成无参构造函数、按
final或@NonNull字段生成构造函数、全参构造函数。 - 示例:
// 生成无参构造函数 @NoArgsConstructor public class User { ... } // 生成按 final 字段的构造函数 @RequiredArgsConstructor public class User { private final String name; private int age; } // 生成全参构造函数 @AllArgsConstructor public class User { ... }
三、进阶注解
1. @Builder
- 作用:为类生成构建器模式(Builder Pattern)。
- 示例:
@Builder public class User { private String name; private int age; } - 使用方式:
User user = User.builder() .name("John") .age(30) .build();
2. @Value
- 作用:生成不可变类(所有字段为
final),并包含equals、hashCode、toString和getter。 - 示例:
@Value public class User { private final String name; private final int age; }
3. @SneakyThrows
- 作用:隐式抛出受检异常(Checked Exception),无需显式
try-catch或声明throws。 - 示例:
public void readData() { @SneakyThrows public void readFile() { Files.readAllLines(Paths.get("file.txt")); // 无需处理 IOException } }
4. @Cleanup
- 作用:自动关闭资源(类似
try-with-resources)。 - 示例:
@Cleanup BufferedReader reader = new BufferedReader(new FileReader("file.txt")); // 使用 reader 后自动关闭
5. @With
- 作用:为类生成
withXxx()方法,用于创建对象的拷贝并修改单个字段。 - 示例:
@With public class User { ... } - 使用方式:
User newUser = originalUser.withName("NewName");
四、日志相关注解
1. @Slf4j
- 作用:生成
private static final Logger log = LoggerFactory.getLogger(Class.class);。 - 示例:
@Slf4j public class MyService { public void doSomething() { log.info("This is a log message"); } } - 其他变体:
@Log4j:适用于 Log4j。@CommonsLog:适用于 Commons Logging。@XSlf4j:适用于 SLF4J + Lombok 的扩展。
五、其他实用注解
1. @Delegate
- 作用:将接口方法委托给内部字段。
- 示例:
public class User { @Delegate private final List<String> hobbies = new ArrayList<>(); } // 现在 User 可以直接调用 List 的方法(如 add(), remove())
2. @NonNull
- 作用:标记字段或参数为非空,若传入
null会抛出NullPointerException。 - 示例:
public void setUser(@NonNull User user) { ... }
3. @Synchronized
- 作用:使方法或代码块线程安全(类似
synchronized关键字)。 - 示例:
@Synchronized public void updateData() { ... }

浙公网安备 33010602011771号