有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有没有办法避免这个“属性值必须是常量”错误?

我们构建了一个注释,用于验证方法的输入。大概是这样的:

@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的一些相关问题后,我理解了为什么会发生这种情况。我主要想知道是否有任何方法可以在不引起此问题的情况下实现constants类中所需的整洁度?还是我要处理很多杂乱的常数


共 (2) 个答案

  1. # 1 楼答案

    可以使用枚举而不是字符串常量列表:

    @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();
    
  2. # 2 楼答案

    除非您遵循ernest's suggestion并重构代码,否则您就不能这样做。您案例中缺少的部分是JSL的强制执行(编译时常量是什么)

    initialized with a constant expression

    而调用一个方法根本不是;即使你能看出这是一个常数,编译器也不能也不会