今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁。
这个注解来自于 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 安装
链式风格
// 链式调用,省略get、set前缀,自定义前缀
@lombok.experimental.Accessors(chain = true, fluent = true,prefix = "g")
Builder 模式,可以看一下设计模式中的建造者模式。
@lombok.Builder
public class Item{
private String itemName;
private String itemDesc;
private Boolean able;
}
调用方式:
Item item = Item.builder().itemName("迷你杯").itemDesc("mini cup").build();
静态构造方法,包含默认构造方法
@RequiredArgsConstructor会生成一个包含常量(final),和标识了@NotNull的变量 的构造方法。
@lombok.Data
@lombok.experimental.Accessors(chain = true)
@lombok.RequiredArgsConstructor(staticName = "ofItemName")
public class Item{
@lombok.NonNull
private String itemName;
@lombok.NonNull
private String itemDesc;
private Boolean able;
}
Item item = Item.ofItemName("迷你杯","mini cup").setAble(true);
val 类型推断
val item = Item.ofItemName("迷你杯","mini cup").setAble(true);
System.out.println(item.toString());
注意点
@EqualsAndHashCode 的使用
在使用lombok简化实体类的时候,我们使用EqualsAndHashCode注解重写Equals和Hash方法,一定要注意该类是否继承自非Object类。EqualsAndHashCode中参数callSuper默认为false,那么设置true、false的区别在于:
调用super的话会在equals和hash方法中将会让父类内容参与进去;
设置为false时只会在本类当中所有属性进行比较和计算。
那么这样的话区别就非常明显了,举个栗子。
/*
*基础商品类
*/
@lombok.Data
@lombok.EqualsAndHashCode(callSuper=false)
public class Item{
private String itemName;
private String itemDesc;
private Boolean able;
}
/*
*生鲜商品类
*/
@lombok.Data
@lombok.EqualsAndHashCode(callSuper=false)
public class FreshItem{
private LocalDate abortDate;
private String itemDesc;
private Boolean able;
}