在Java中为什么会出现“属性值必须是常量”的错误?

35

我有一些TestNG的代码,在其中传递了一个名为timeOut = TESTNG_TEST_TIMEOUT的测试注释参数。

@Test(description = "Tests something.", groups = { "regression" }, 
   timeOut = TESTNG_TEST_TIMEOUT, enabled = true)

在我的TestBase类中,我有这个成员:

public final static long TESTNG_TEST_TIMEOUT = TimeUnit.MINUTES.toMillis(5);
当我使用上述代码行时,在Eclipse中会出现“属性值必须是常量”的错误提示。
但是,如果我像这样简单定义成员,则可以正常工作:
public final static long TESTNG_TEST_TIMEOUT = 300000;

TimeUnit的使用不是常量吗?


1
@HotLicks 尝试使用静态初始化块,但不幸的是它对我没有起作用。 - AjCodez
1个回答

52

这个

public final static long TESTNG_TEST_TIMEOUT = 300000;

这是一个常量变量,一种常量表达式类型。

这个

public final static long TESTNG_TEST_TIMEOUT = TimeUnit.MINUTES.toMillis(5);

不是这样的。

注解成员期望常量表达式(以及一些其他东西,如枚举和Class字面量)。


4
谢谢提供超链接。我看到文档说常量必须是原始类型或预声明的字符串。谢谢。 - djangofan
我还要补充一点,public final static long TESTNG_TEST_TIMEOUT = 50; 是一个常量变量,但是public final static long TESTNG_TEST_TIMEOUT = 50 + 60; 不是。 - javadev
2
@java 实际上是的。 - Sotirios Delimanolis
4
提醒其他人,public static final Long TESTING_TEST_TIMEOUT = 300000L; 不是一个常量值,应该使用原始类型 long。请注意不改变原意。 - Jason Bristol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接