最全的 lombok 注解详情(随着版本不定时更新)

一、安装插件,eclipse 对于 lombok 的支持

二、引入依赖

<dependency>
	<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version> <!-- Spring Boot 项目此部分可以不写 -->
</dependency>

三、基本注解的使用(注解属性非必选)

@AllArgsConstructor:作用于类,生成参数为所有实例变量的构造函数
@Builder:作用于类,将其变成建造者模式1
@Cleanup:作用于变量,自动关闭资源,针对实现了 java.io.Closeable 接口的对象有效
@CustomLog:作用于类,生成 log 对象,用于记录日志2
@Data:作用于类,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@EqualsAndHashCode:作用于类,覆盖默认的 equals 和 hashCode3
@Generated:用于标记类、变量、方法是自动生成的,没什么用
@Getter:作用于类,生成该类所有的实例变量的 getter 方法。作用于变量,生成变量的 getter 方法
@NoArgsConstructor:作用于类,生成无参构造方法
@NonNull:作用于成员变量和参数中,标识不能为空,否则抛出空指针异常
@RequiredArgsConstructor:作用于类,生成包含 final 和 @NonNull 注解的成员变量的构造方法
@Setter:作用于类,生成该类所有的实例变量的 setter 方法。作用于变量,生成该变量的 setter 方法
@Singular:作用于集合字段,需要配合 @Builder 使用
@SneakyThrows:作用于方法,对异常进行捕捉并抛出
@Synchronized:作用于方法,可以替换 synchronize 关键字或 lock 锁
@ToString:作用于类,覆盖默认的 toString() 方法
@val,作用于类、变量,主要用于声明变量的类型,注解将从初始化程序表达式中推断类型,生成的变量是 final 不可以变
@Value:作用于类,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @RequiredArgsConstructor
@var:和 @val 一样,两者区别在于 var 不加 final
@With:作用于类、变量,生成 with + 变量名的方法,返回当前对象

三、外部注解的使用

@CommonsLog,@Log,@JBossLog,@Log4j,@Log4j2,@Slf4j,@XSlf4j:日志注解,作用于类

四、实验性注解的使用

@Accessors:类似于 @Builder 支持链式调用,需要配合 @Setter@Getter 等注解使用,作用于类、变量
@Delegate:作用于容器变量,为该变量生成一堆常用的方法,这些方法都是容器中的方法
@ExtensionMethod:作用于类,向类添加方法,无需创建新的子类
@FieldDefaults:作用于类,定义变量的访问修饰符以及是否加 final
@FieldNameConstants:作用于类,生成一个包含所有成员变量的内部类或者内部枚举,内部类中每个字段值即为字段名,并且值不可变
@Helper:作用于方法内部类,使内部类中的方法暴露在外面可以被直接调用,不建议使用
@NonFinal:作用于类、变量,表示变量不加 final
@PackagePrivate:作用于类和变量,相当于访问修饰符的 default,没什么用
@SuperBuilder:作用于类,@Builder 的升级版
/**
 * @Builder 不支持对基类成员属性的构造
 * 而 @SuperBuilder 就是为了解决这个问题而产生的
 * 基类和派生类不能同时存在 @Builder
 * 如果基类使用了 @Builder,则派生类需要写出全参构造方法
 */
public class 马小茜 {
    
    
    private Integer age;
    
    private String name;
}

@Builder
public class 龙一一 extends 马小茜 {
    
    
	public static void main(String[] args) {
    
    
		龙一一.builder().name("龙一一").build(); // 这个时候是不能对 name 属性赋值
	}
}
/**
 * 如果基类使用了 @SuperBuilder
 * 那么派生类必须存在 @SuperBuilder 或者写出参数为:基类Builder<?, ?> 的构造方法
 * 
 * builderMethodName:创建内部静态类的方法名,默认值为 builder
 * buildMethodName:创建实体类的方法名,默认值为 build
 * toBuilder:设置为 true 可以对这个对象进行拷贝生成新的对象,可以在修改,默认为 false。
 * setterPrefix:setter 方法的前缀
 */
@SuperBuilder(builderMethodName = "builder", buildMethodName = "build", toBuilder = true, setterPrefix = "k")
public class 马小茜 {
    
    
    private Integer age;
    private String name;
}

@SuperBuilder
public class 龙一一 extends 马小茜 {
    
    
	public static void main(String[] args) {
    
    
		龙一一.builder().kName("龙一一").build();
	}
}
@Tolerate:实现对冲突的兼容,作用于方法上,没什么大用,可以配合 @Builder 使用
@UtilityClass:作用于类,将类标记为 final,并且类、内部类中的方法、字段都标记为 static
/**
 * 1.将类标记为 final
 * 2.类和内部类中的方法、字段都标记为 static
 * 3.无法实例化
 */
@UtilityClass
public class 古力娜扎 {
    
    
	public String name;
	
	public int aaa() {
    
    
		return 0;
	}
	
	public static void main(String[] args) {
    
    
		古力娜扎.aaa();
		String a = 古力娜扎.name;
	}
}
@WithBy4

五、Lombok 的优缺点

  • 优点:
    能通过注解的形式自动生成构造器、getter / setter、equals、hashcode、toString 等方法,提高了一定的开发效率
    让代码变得简洁,不用过多的去关注相应的方法
    属性做修改时,也简化了维护为这些属性所生成的 getter / setter 方法等

  • 缺点:
    不支持多种参数构造器的重载
    虽然省去了手动创建一系列方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

六、待完善的


  1. @Builded.ObtainVia 待完善 ↩︎

  2. @CustomLog:编译不通过 ↩︎

  3. @EqualsAndHashCode.Include(replaces = “”) ↩︎

  4. @WithBy ↩︎

Guess you like

Origin blog.csdn.net/qq_39249094/article/details/107313582