我有以下注释:
public @interface ExceptionPair {
public Class<?> exception();
public String message()
default "The following exception thrown:" + exception().toString();
//error: not a constant
}
是否有一些技巧可以使用我的例子中的其他值定义一个defult值?
答案 0 :(得分:2)
这是不可能的。
注释值在JLS 9.7.1中描述。语言不是很清楚,但基本上值必须是常量(或“内联”常量数组):
如果T是基本类型或字符串,则V是常量表达式(第15.28节)。
这并不排除字符串连接,但是连接字符串必须是常量,如JLS 15.28中所定义。由于exception().toString()
不是常数(方法的结果永远不是常量),因此"foo" + exception().toString()
也不是。
你真正能做的唯一技巧是指定一个表示空消息的字符串,而在调用站点,如果你看到该字符串,则返回"The following exception thrown:" + annotation.exception()
。空字符串""
是该值的良好候选者(但不能为空)。
答案 1 :(得分:1)
简而言之,没有。
默认值必须是常量,可以是基元或字符串。由于字符串在Java中是不可变的,为了将exception().toString()
连接到前一个String,必须创建一个新的String。当然,创建新对象不是常量,因此不允许连接。此外,由于exception().toString()
可以更改,default
值永远不会不变。