官网:https://projectlombok.org/
val
final+类型 的 缩写
val example = new ArrayList<String>();
// 等于
final ArrayList<String> example = new ArrayList<String>();
也可以for循环中使用
for (val entry : map.entrySet())
// 等于
for (final Map.Entry<Integer, String> entry : map.entrySet())
var
类型的缩写
var x = "Hello";
// 等于
String x = "Hello";
@NonNull
在对象调用方法前判断是否为空 如果是则抛出空指针异常
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
不使用注解
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person is marked @NonNull but is null");
}
this.name = person.getName();
}
}
@Cleanup
防止你忘记关闭IO资源
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
不使用注解
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
}
@Getter and @Setter
给你的类或字段属性自动生成get和set方法
@ToString
给你的类自动生成toString方法
@EqualsAndHashCode
自动给你的类重写equals和hashcode方法
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
给你的类自动生成无参构造方法,必有@NonNull标注的属性的构造方法,全参构造方法
@Data
包含以下注解
All together now: A shortcut for @ToString
, @EqualsAndHashCode
, @Getter
on all fields, @Setter
on all non-final fields, and @RequiredArgsConstructor
!
@Value
使你的类变成不可变类
不可变类,生成实例后属性值不可变,只能通过new的时候构造方法来初始化。
不可变类的具体要求:
- 使用private和final修饰符来修饰该类的成员变量;
- 提供带参数的构造器,根据传入的参数来初始化类里的成员变量;
- 仅为该类的成员变量提供getter方法,不要提供setter方法,因为普通方法无法修改final修饰的成员变量;
- 不允许子类覆盖方法。最简单的方法是将该类声明为final。一种更复杂的方法是使用private工厂方法来构造构造器和构造实例。
- 如果有必要,重写Object类的hascode()和equals()方法。equals方法根据关键成员变量来作为两个对象是否相等的标准,除此之外,还应该保证两个用equals方法判断为相等的对象的hashCode()也相等。
@Builder
链式编程
@SneakyThrows
放在需要捕获异常的方法上,就可以不用try-catch了
原理:非RuntimeException编译时如果没有捕获异常,编译器就会报错
那么使用这个注解,它会把异常包装成RuntimeException骗过编译器,不用try-catch处理了
@Synchronized
给你的方法加锁,保证同一时刻,只有一个线程可以访问这个方法
官方解释:
类比synchronized关键字,synchronized关键字锁的this或者自己的类对象,因为其他不受自己控制代码也可以能锁定这些对象
这就会造成竞争条件和其他危险的线程相关的bug
综上所述,其实就是比synchronized关键字更安全
@With
你只想要更改某个对象的某个属性值,其它好多属性的值保留不变,使用这个注解它会给你返回一个新对象,即克隆原有属性
新对象包含有更改之后的属性值,还有原来不变的属性值
@Getter(lazy=true)
当你对象的某个属性的值计算占用大量 CPU 或该值占用大量内存,使用这个注解,调用get方法可以只计算一次
计算完之后会存入缓存中,下次调用get方法不会再进行计算
要求:这个属性被 private final 修饰 即调用get方法存入缓存之后 值将不会再变
@Log
通过你标注的注解,来生成相应的log对象,这样你就可以使用这个log对象,调用相应的日志方法来输出不同等级的日志
slf4j为例
@Slf4j
public class LogExampleOther {
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
相当于
public class LogExampleOther {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
public static void main(String... args) {
log.error("Something else is wrong here");
}
}