3 回答

TA贡献1829条经验 获得超4个赞
编译常量只能是基元和字符串:
15.28。常数表达式
编译时常量表达式是表示基本类型的值的表达式或不突然完成的字符串,仅使用以下内容组成:
原始类型的文字和类型的文字
String
转换为基本类型和转换为类型
String
[...]运营商[...]
括号表达式,其包含的表达式是常量表达式。
引用常量变量的简单名称。
TypeName表单的限定名称。引用常量变量的标识符。
实际上在java中没有办法保护数组中的项目。在运行时,有人总能这样做FieldValues.FIELD1[0]="value3"
,因此如果我们看得更深,那么数组就不能真正保持不变。

TA贡献1809条经验 获得超8个赞
您可以使用常量(即静态的最终变量)作为注释的参数。作为一个简单的例子,我经常使用这样的东西:
import org.junit.Test;import static org.junit.Assert.*;public class MyTestClass{ private static final int TEST_TIMEOUT = 60000; // one minute per test @Test(timeout=TEST_TIMEOUT) public void testJDK() { assertTrue("Something is very wrong", Boolean.TRUE); }}
请注意,可以将TEST_TIMEOUT
常量直接传递给注释。
另外,我不记得曾经用数组试过这个,所以你可能会遇到一些问题,与Java变量相比,数组如何表示为注释参数?但至于问题的其他部分,你绝对可以使用一个常量String而没有任何问题。
编辑:我刚刚尝试使用String数组,并没有遇到你提到的问题 - 但编译器确实告诉我“属性值必须是常量”,尽管数组被定义为public static final String[]
。也许它不喜欢数组是可变的这个事实?嗯...

TA贡献1993条经验 获得超5个赞
在示例中,您没有为它提供数组。以下编译正常:
public @interface SampleAnnotation { String[] sampleValues(); } public class Values { public static final String v1 = "A"; public static final String v2 = "B"; @SampleAnnotation(sampleValues = { v1, v2 }) public void foo() { } }
添加回答
举报