今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁。

这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用@Data 注解时, 需要导入lombok.Data,下面列举下 lombok提供的注解:

val : 和 scala 中 val 同名, 可以在运行时确定类型; @NonNull : 注解在参数上, 如果该类参数为 null , 就会报出异常, throw new NullPointException(参数名) @Cleanup : 注释在引用变量前, 自动回收资源 默认调用 close() 方法 @Getter/@Setter : 注解在类上, 为类提供读写属性 @Getter(lazy=true) : @ToString : 注解在类上, 为类提供 toString()方法 @EqualsAndHashCode : 注解在类上, 为类提供 equals()和 hashCode()方法 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor : 注解在类上, 为类提供无参,有指定必须参数, 全参构造函数。@RequiredArgsConstructor会生成一个包含常量(final),和标识了@NotNull的变量 的构造方法。 @Data : 注解在类上, 为类提供读写属性, 此外还提供了: @ToString()、@Getter()、@Setter()、@EqualsAndHashCode()、@NoArgsConstructor()方法。 @Value : @Builder : 注解在类上, 为类提供一个内部的 Builder @SneakThrows : @Synchronized : 注解在方法上, 为方法提供同步锁 @Log : 使用的是 java.util.logging.Logger ,直接使用 变量 log。 @Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象 @Slf4j : 注解在类上, 为类提供一个属性名为 log 的 Slf4j 的日志对象

@Cleanup(“dispose”) org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);

上面一些注解是由包含关系的, 看需要什么方法就增加什么注解,@Log4j 和 @Slf4j 注解作用不小, 用在各层都可以,方便打 log。

注意的是,同时使用@Data()和 @AllArgsConstructor()后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor();另外,类中有自定义的构造器再使用@AllArgsConstructor()和@NoArgsConstructor()注解会报错。

idea 安装

@Data 注解引出的 lombok 小辣椒 - 图1

链式风格

  1. // 链式调用,省略get、set前缀,自定义前缀
  2. @lombok.experimental.Accessors(chain = true, fluent = true,prefix = "g")

Builder 模式,可以看一下设计模式中的建造者模式。

  1. @lombok.Builder
  2. public class Item{
  3. private String itemName;
  4. private String itemDesc;
  5. private Boolean able;
  6. }

调用方式:

  1. Item item = Item.builder().itemName("迷你杯").itemDesc("mini cup").build();

静态构造方法,包含默认构造方法

@RequiredArgsConstructor会生成一个包含常量(final),和标识了@NotNull的变量 的构造方法。

  1. @lombok.Data
  2. @lombok.experimental.Accessors(chain = true)
  3. @lombok.RequiredArgsConstructor(staticName = "ofItemName")
  4. public class Item{
  5. @lombok.NonNull
  6. private String itemName;
  7. @lombok.NonNull
  8. private String itemDesc;
  9. private Boolean able;
  10. }
  1. Item item = Item.ofItemName("迷你杯","mini cup").setAble(true);

image.png

val 类型推断

  1. val item = Item.ofItemName("迷你杯","mini cup").setAble(true);
  2. System.out.println(item.toString());

注意点

@EqualsAndHashCode 的使用

在使用lombok简化实体类的时候,我们使用EqualsAndHashCode注解重写Equals和Hash方法,一定要注意该类是否继承自非Object类。EqualsAndHashCode中参数callSuper默认为false,那么设置true、false的区别在于:
调用super的话会在equals和hash方法中将会让父类内容参与进去;
设置为false时只会在本类当中所有属性进行比较和计算。

那么这样的话区别就非常明显了,举个栗子。

  1. /*
  2. *基础商品类
  3. */
  4. @lombok.Data
  5. @lombok.EqualsAndHashCode(callSuper=false)
  6. public class Item{
  7. private String itemName;
  8. private String itemDesc;
  9. private Boolean able;
  10. }
  11. /*
  12. *生鲜商品类
  13. */
  14. @lombok.Data
  15. @lombok.EqualsAndHashCode(callSuper=false)
  16. public class FreshItem{
  17. private LocalDate abortDate;
  18. private String itemDesc;
  19. private Boolean able;
  20. }