lombok

官网: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");
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王景清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值