【问题标题】:Converting a numeric constant to a constant string expression将数字常量转换为常量字符串表达式
【发布时间】:2016-04-22 10:14:52
【问题描述】:

我的应用程序中的实体类声明了一个数字常量,如

public static final int MAX_VALUE = 999;

此常量已在应用程序的不同部分使用。

现在我想在参数注解中使用这个常量。问题是注解@DefaultValue 需要一个字符串而不是一个int。所以我尝试使用String.valueOf 来获取字符串

@DefaultValue(String.valueOf(PDCRuleMapping.MAX_VALUE)) final int upperBound,

但它不能编译,因为

注解属性DefaultValue.value的值必须是常量表达式

我可以重用我的数字常量以某种方式获得一个常量字符串表达式,还是我必须写"999"

【问题讨论】:

    标签: java constants


    【解决方案1】:

    到目前为止,唯一对我有用的解决方法是定义一个字符串常量,如下所示:

    public static final String MAX_VALUE_AS_STRING = "" + MAX_VALUE;
    @DefaultValue(MAX_VALUE_AS_STRING) final int upperBound;
    

    或者,您可以直接在注释内使用字符串连接:

    @DefaultValue("" + MAX_VALUE) final int upperBound;
    

    请记住,在此上下文中所需的 constant expressions 不允许方法调用,仅允许运算符。

    【讨论】:

    • 这应该是答案。很确定没有人想看到“”+,但你知道,它有效。 :)
    【解决方案2】:

    我认为你只有两个选择:

    • 在注解@DefaultValue("999") 中使用字符串文字
    • 或者声明一个字符串常量:

      public static final int MAX_VALUE = 999;
      private static final String MAX_VALUE_STRING = "" + MAX_VALUE;
      @DefaultValue(MAX_VALUE_STRING)
      

      如果您在注释中使用该值的唯一位置是在一个类中,您可能希望在该类中声明字符串常量私有。

    【讨论】:

    • 字符串常量不起作用。它会给出错误:元素值必须是一个常量表达式。
    • @AhmadShahwan 一个字符串常量是一个常量表达式,所以是的,它可以工作。
    • 你试过了吗?如果没有,请在此处查看tpcg.io/0yhgUG 我创建了一个 sn-p 来实现您对字母的解决方案,但我仍然得到“元素值必须是一个常量表达式”。
    • @AhmadShahwan 你是对的,因为我使用的是String.valueOf - 我已经修改了我的代码,使它确实是一个常量。
    【解决方案3】:

    根据String 类型的第一个常量定义一个新常量,并在注释中使用该常量。

    public static final int MAX_VALUE = 999;
    public static final String MAX_VALUE_AS_STRING = String.valueOf(MAX_VALUE);
    

    那么你可以有以下,而不重复最大值的值:

    @DefaultValue(PDCRuleMapping.MAX_VALUE_AS_STRING) final int upperBound;
    

    【讨论】:

    • 这行不通。它会给出错误:元素值必须是一个常量表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多