由于属性必须是常量表达式错误,Java代码将无法编译

Kas*_*uez 32 java string spring annotations constants

我无法弄清楚为什么以下不会编译.IDE给我的错误是"注释属性RequestParam.defaultValue的值必须是常量表达式".

我的项目涉及Spring和Maven,它包括以下内容:

private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);

@RequestMapping(method=RequestMethod.GET)
public List<Spittle> spittles(
        @RequestParam(value="max",
                    defaultValue=MAX_LONG_AS_STRING) long max,
        @RequestParam(value="count", defaultValue="20") int count) {
    return spittleRepository.findSpittles(max, count);
}
Run Code Online (Sandbox Code Playgroud)

我认为错误来自Long转换为String,但我不知道如何解决它.我会感激任何帮助,我是注释和Spring的新手.

ajb*_*ajb 58

Java规则说当你有一个注释,并且它有一个需要基本类型(如a int)或a的参数时String,该值必须是一个常量表达式.[这与Spring无关.]粗略地说,常量表达式是编译器在编译时可以得出的值.但是,有什么构成常量表达式的规则.这些规则在JLS 15.28中.在常量表达式中只能使用某些类型的操作.方法调用,例如Long.toString(),不是其中之一.所以使用它会使你的表达式不是一个常量表达式,即使它看起来应该是这样.(它看起来像你,因为你知道是什么Long.toString.但是,编译器没有保留所有方法的目录,以了解哪些是"常量"方法,其值可以在编译时计算出来.)

但是,链接上的示例显示+可以使用运算符,即使其中一个参数不是字符串,因此toString()隐式调用方法.这表明你可以使事情像这样工作:

private static final String MAX_LONG_AS_STRING = "" + Long.MAX_VALUE;
Run Code Online (Sandbox Code Playgroud)

不过我还没试过.

  • @junvar 没有什么可以阻止编译器为 `Long.toString(Long.MAX_VALUE)` 创建一个常量字符串。有多个 Java 编译器,每个编译器都可以决定是否将其优化为常量字符串。但是,无论编译器如何,Java 关于合法与否的规则都是相同的。合法性规则不依赖于编译器可能会或可能不会进行的可选优化。 (3认同)
  • toString()是运行时的方法调用。`“” + 5`在编译时创建一个常量字符串(因为它们是不可变的)-我可能错了 (2认同)