有什么方法可以避免此“属性值必须为常数”错误?

时间:2018-09-10 08:34:59

标签: java annotations

我们有一个已建立的注释,用于验证方法的输入。像这样:

@InputValidation(paramName = "foo", regularExpression = RegularExpressionConstants.FOO_REG_EX)

我们的RegularExpressionConstants类具有许多不同的字符串常量,它们均表示不同的正则表达式。此类看起来非常混乱,所以我开始尝试使用使其更易于阅读的方法来整理它。因此,该类现在看起来像这样:

public static final String FOO_REG_EX = alphanumericWithRange(1, 16);
public static final String BAR_REG_EX = alphanumericWithRange(2,4);

private static String alphanumericWithRange(int lowerLimit, int upperLimit) {
    "[a-zA-Z0-9]{" + lowerLimit + "," + upperLimit + "}";
}

RegularExpressionConstants类可以编译,但是注释不再可以编译。错误为Attribute value must be constant。在查看了StackOverflow上的一些相关问题之后,我了解了为什么会这样。我主要是想知道是否有什么方法可以在常量类中实现想要的整理效果而不会引起此问题?还是我只需要处理许多混乱的常数?

2 个答案:

答案 0 :(得分:3)

您可以使用枚举代替字符串常量列表:

@interface InputValidation {
    RegularExpressionConstants regularExpression() default 
             RegularExpressionConstants.FOO_REG_EX;
}

使用枚举还可以将name元数据移动到定义模式的地方

enum RegularExpressionConstants {
    FOO_REG_EX("foo", alphanumericWithRange(1, 16)), 
    BAR_REG_EX("bar", alphanumericWithRange(2,4));

    private final String name;
    private final String pattern;

    private RegularExpression(String name, String pattern) {
        this.name = name;
        this.pattern = pattern;
    }

    public String getName() {
        return name;
    }

    public String getPattern() {
        return pattern;
    }

    private static String alphanumericWithRange(int lowerLimit, int upperLimit) {
        return "[a-zA-Z0-9]{" + lowerLimit + "," + upperLimit + "}";
    }
}

可以使用枚举应用注释:

@InputValidation(regularExpression=RegularExpressionConstants.FOO_REG_EX)

在处理注释的地方,只需调用即可:

String pattern = field.getAnnotation(InputValidation.class)
    .regularExpression()
    .getPattern();

答案 1 :(得分:1)

除非您遵循ernest's suggestion并重构代码,否则根本无法这样做。您的案例中缺少的部分是JSL的强制执行(关于编译时间常数是什么)

  

用常量表达式初始化

和调用方法根本不是;即使您可以说这是一个常量,编译器也不能也不愿意。