我有以下Foo测试类和Bar测试类文件
public class Foo{
public static final int timeLimit;
static{
timeLimit=10000;
}
@Test(timeOut=timeLimit)
public void fooTest{
//timeout annotation is just used to specify the
//maximum execution time for this test method
}
}
public class Bar{
public static final int timeLimit=10000;
@Test(timeOut=timeLimit)
public void barTest{
//timeout annotation is just used to specify the
//maximum execution time for this test method
}
}
当我尝试编译这两个类时,Bar正确编译,但是Foo类说应该为超时分配一个常量值,有人可以解释一下原因吗?
答案 0 :(得分:4)
注释属性只能分配constant expressions(以及few other types)。
在Foo
public static final int timeLimit;
static{
timeLimit=10000;
}
@Test(timeOut=timeLimit)
变量timeLimit
不是常量表达式。
答案 1 :(得分:1)
我怀疑这是因为原始public static final
字段实际上是由编译器在从另一个类引用时内联的。如果你必须加载另一个类来接收它,编译器就不能这样做。
我遗憾地在JLS中隐含地发现了这一点:
请注意,作为常量变量的静态字段(§4.12.4)是 在其他静态字段之前初始化(第12.4.2节)。这也适用于 接口(第9.3.1节)。永远不会观察到这样的领域 默认初始值(§4.12.5),即使是狡猾的程序。
显然,如果必须在其他静态字段之前初始化它们,则无法在静态块中初始化它们。