文章目录
🔊 试验性的注解,目前正在 试验中,谨慎使用。主要原因如下:
- 没有做过像核心特性那样的测试
- 没法像核心特性那样快速修复 bug
- 如果找到了更好的解决方案,则试验性特性可能会被重写或大量变更
- 如果不够通用的话,可能后期会被移除
常用试验性注解
下面介绍一些常用的试验性注解。
工具类 - @UtilityClass
🤷 场景:很多时候,我们需要编写一个工具类。
😎 Java 解决方案:
Java工具类 - 编写规范
😎 Lombok 解决方案:提供 @UtilityClass 注解,将类 final 化,构造方法私有化,方法、字段、内部类 static 化。
注意:不要使用非的静态导入,否则 javac 编译器无法理解。
正确方式:import static ThisType.,或者不使用静态导入。
示例:
@UtilityClass
public class UtilityClassExample {
private final int CONSTANT = 5;
public int addSomething(int in) {
return in + CONSTANT;
}
}
public final class UtilityClassExample {
private static final int CONSTANT = 5;
private UtilityClassExample() {
throw new java.lang.UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
public static int addSomething(int in) {
return in + CONSTANT;
}
}
自定义标准异常 - @StandardException
🤷 场景:java 中的自定义异常,一般都会覆盖父类的构造方法,且传入 message 或 cause 字段。如下所示:
public class ServiceException extends RuntimeException {
public ServiceException() {
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
}
😎 Lombok 解决方案:提供 @StandardException 快速创建自定义异常(extends Exception 或 Throwable)的 4 个构造器。可配置项为构造器的访问级别。
- 无参构造器
- 只有 message 的构造器
- 只有 cause 的构造器
- 有 message 和 cause 的构造器
例子:
@StandardException
public class ServiceException extends RuntimeException {
}
public class ServiceException extends RuntimeException {
public ServiceException() {
this((String)null, (Throwable)null);
}
public ServiceException(String message) {
this(message, (Throwable)null);
}
public ServiceException(Throwable cause) {
this(cause != null ? cause.getMessage() : null, cause);
}
public ServiceException(String message, Throwable cause) {
super(message);
if (cause != null) {
super.initCause(cause);
}
}
}
流式 API - @Accessors
setter/getter 流式 API,设置属性后,返回当前实例对象。
示例如下:
@Accessors(fluent = true)
public class AccessorsExample {
@Getter
@Setter
private int age = 10;
}
public class AccessorsExample {
private int age = 10;
public int age() {
return this.age;
}
public AccessorsExample age(final int age) {
this.age = age;
return this;
}
}
onMethod= / onConstructor= / onParam=
前面我们看到,有的注解上可以配置 onMethod、onConstructor、onParam 参数,其可以在生成的方法、构造方法,方法参数上添加自定义的注解。
值得注意的是:类型为 AnyAnnotation[],不同的 JDK 版本写法不同哦
- JDK7:@Getter(onMethod=@__({@AnnotationsGoHere}))
- JDK8:@Getter(onMethod_={@AnnotationsGohere})
其它试验性注解
@ExtensionMethod:在已有类型中加入新方法
@FieldDefaults:设置字段的默认信息,比如 final、访问级别等
@Delegate:委派访问,使用 delegate 对象来操作
@Helper:在一个方法中创建一个类,然后调用该类中的方法
@FieldNameConstants:创建类的的字段名称为常量,比如类中某个字段名称,需要变成 String,方便后续反射时使用
@SuperBuilder:使用父类的字段进行 Builder 操作
@Tolerate:使 Lombok 忽略已有类中的方法或构造方法
@Jacksonized:是 @Builder 和@SuperBuilder 的附加注解,自动配置生成的 Builder 使用 Jackson 反序列化。
参考
1.https://projectlombok.org/features/experimental/
更多文章
1.消除代码冗长神器 - Lombok | 入门-CSDN博客
2.消除代码冗长神器 - Lombok | 安装-CSDN博客
3.消除代码冗长神器 - Lombok | val/var 本地变量声明-CSDN博客
4.消除代码冗长神器 - Lombok | @Setter/@Getter 生成 setter/getter 方法-CSDN博客
5.消除代码冗长神器 - Lombok | @EqualsAndHashCode/@ToString注解详解-CSDN博客
6.消除代码冗长神器 - Lombok | @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor 构造方法-CSDN博客
7.消除代码冗长神器 - Lombok | @Data 通用 POJO 注解-CSDN博客
8.消除代码冗长神器 - Lombok | @With 不可变的 setter 方法-CSDN博客
9.消除代码冗长神器 - Lombok | @Value 不可变 entity-CSDN博客
10.消除代码冗长神器 - Lombok | @Cleanup 自动清理资源-CSDN博客
11.消除代码冗长神器 - Lombok | @Log/@Slf4j 创建日志对象-CSDN博客
12.消除代码冗长神器 - Lombok | @Builder注解 - Builder 设计模式快速实现
13.消除代码冗长神器 - Lombok | @NonNull 判空逻辑
14.消除代码冗长神器 - Lombok | @SneakyThrows 检查型异常转抛
15.消除代码冗长神器 - Lombok | @Synchronized 锁
16.消除代码冗长神器 - Lombok | 试验性注解
17.消除代码冗长神器 - Lombok | 进阶用法 - 全局配置 & 去除Lombok
18.消除代码冗长神器 - Lombok | 高阶用法 -> 手写 @Getter 注解