@FieldNameConstants(自动生成字段名称常量)

背景:根据类属性生成字符串常量,当注解中要使用时就很方便了

1. @FieldNameConstants是什么

@FieldNameConstants是Lombok库中的一个注解,用于自动生成字段名称常量。

当你在类中使用@FieldNameConstants注解时,Lombok会扫描类的所有字段,并为每个字段生成一个对应的常量。

例如,如果你有一个类定义如下:

import lombok.experimental.FieldNameConstants;

@FieldNameConstants
public class MyClass {

    private String name;
    private Integer age;

}

Lombok会在编译时自动生成以下代码:

public class MyClass {

    private String name;
    private Integer age;

    public static final class Fields {
        public static final String name = "name";
        public static final String age = "age";
    }

}

从IDEA的Structure可以得到验证

@FieldNameConstants(自动生成字段名称常量)_第1张图片

2. @FieldNameConstants注解(源码)

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface FieldNameConstants {
	lombok.AccessLevel level() default AccessLevel.PUBLIC;
	boolean asEnum() default false;
	String innerTypeName() default "";
	
	/**
	 * Only include fields and methods explicitly marked with {@code @FieldNameConstants.Include}.
	 * Normally, all (non-static) fields are included by default.
	 * 
	 * @return If {@code true}, don't include non-static fields automatically (default: {@code false}).
	 */
	boolean onlyExplicitlyIncluded() default false;
	
	/**
	 * If present, do not include this field in the generated fieldnames inner type.
	 */
	@Target(ElementType.FIELD)
	@Retention(RetentionPolicy.SOURCE)
	public @interface Exclude {}
	
	/**
	 * If present, include this field in the generated fieldnames inner type (default).
	 */lbp晚上也要发布
	@Target(ElementType.FIELD)
	@Retention(RetentionPolicy.SOURCE)
	public @interface Include {}
}

a. 主要有四个属性

  • level:生成常量的访问修饰符
  • asEnum:生成枚举
  • innerTypeName:内部类名称
  • onlyExplicitlyIncluded:表明只引入声明了Include注解的字段,需要与Include搭配使用
ⅰ. level属性

level可填范围如下,与普通的修饰符一样

默认PUBLIC(lombok.AccessLevel level() default AccessLevel.PUBLIC)

public enum AccessLevel {
	PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
	/** Represents not generating anything or the complete lack of a method. */
	NONE;
}

用法如下

@FieldNameConstants(level = AccessLevel.PUBLIC)

ⅱ. asEnum

是否生成枚举类

@FieldNameConstants(asEnum = true) 等于在内部自动生成了一个枚举类

@FieldNameConstants(asEnum = true)
public class MyClass {

    private String name;
    private Integer age;


    public static enum Fields {
        name,
        age
    }
}
ⅲ. innerTypeName

自定义内部类名称

@FieldNameConstants(innerTypeName = “AAA”)

等于生成一个AAA的内部类

@FieldNameConstants(innerTypeName = "AAA")
public class MyClass {

    private String name;
    private Integer age;


    public static final class AAA {
        public static final String name = "name";
        public static final String age = "age";
    }
}
ⅳ. onlyExplicitlyIncluded

表明只引入声明了Include注解的字段,需要与Include搭配使用

@FieldNameConstants(onlyExplicitlyIncluded = true)

表示只生成name属性

@FieldNameConstants(onlyExplicitlyIncluded = true)
public class MyClass {

    @FieldNameConstants.Include
    private String name;
    private Integer age;


    public static final class fields {
        public static final String name = "name";
    }
}

3. 实际案例

注解中使用

注解@NotNull中message只能使用常量

现在注解里可以使用前面定义的(这里只是展示注解中可以使用,实际情况应该不会用在@NotNull中)

@Slf4j
public class Student {

    @NotNull(message = "id不能为空")
    private String name;

    @NotNull(message = MyClass.Fields.age)
    private Integer age;

}

你可能感兴趣的:(java,后端,spring,boot)