![](/img/trans.png)
[英]Final static variable initialized in static block using method that throws exception
[英]Initializing a static final int from static block or method and using it in annotations
我有以下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类说应该为超时分配一个恒定值,有人可以解释为什么吗?
我怀疑这是因为原始public static final
字段实际上是在从另一个类引用时由编译器内联的。 如果必须加载另一个类以使其接收值,则编译器无法执行此操作。
不幸的是,我仅在JLS中隐式地发现了这一点:
请注意,作为常量变量的静态字段(第4.12.4节)在其他静态字段(第12.4.2节)之前被初始化。 这也适用于接口(第9.3.1节)。 即使使用vious回的程序,也永远不会观察到此类字段具有其默认初始值(第4.12.5节)。
显然,如果必须在其他静态字段之前对其进行初始化,则无法在静态块中对其进行初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.