是否可以使用注释中的其他值?

时间:2015-08-03 16:01:34

标签: java annotations

我有以下注释:

public @interface ExceptionPair {

    public Class<?> exception();

    public String message() 
         default "The following exception thrown:" + exception().toString(); 
        //error: not a constant
}

是否有一些技巧可以使用我的例子中的其他值定义一个defult值?

2 个答案:

答案 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永远不会不变。