Java 从静态块或方法初始化静态final int并在注释中使用它
我有以下Foo测试类和Bar测试类文件Java 从静态块或方法初始化静态final int并在注释中使用它,java,spring,junit,testng,Java,Spring,Junit,Testng,我有以下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
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类说应该给timeout分配一个常量值,有人能解释为什么吗?我怀疑这是因为当从另一个类引用时,primitive
public static final
字段实际上是由编译器内联的。如果必须加载另一个类才能接收值,编译器将无法执行此操作
不幸的是,我只是在JLS中发现了这一点:
请注意,作为常量变量(§4.12.4)的静态字段是
在其他静态字段之前初始化(§12.4.2)。这也适用于以下情况:
接口(§9.3.1)。这样的领域永远不会被观察到有自己的价值
默认初始值(§4.12.5),即使是通过不正当的程序
显然,如果它们必须在其他静态字段之前初始化,它们就不能在静态块中初始化。我怀疑这是因为当从另一个类引用时,原语
公共静态final
字段实际上是由编译器内联的。如果必须加载另一个类才能接收值,编译器将无法执行此操作
不幸的是,我只是在JLS中发现了这一点:
请注意,作为常量变量(§4.12.4)的静态字段是
在其他静态字段之前初始化(§12.4.2)。这也适用于以下情况:
接口(§9.3.1)。这样的领域永远不会被观察到有自己的价值
默认初始值(§4.12.5),即使是通过不正当的程序
显然,如果必须在其他静态字段之前对其进行初始化,则不能在静态块中对其进行初始化。只能指定注释属性(和一个) 在
Foo中
public static final int timeLimit;
static{
timeLimit=10000;
}
@Test(timeOut=timeLimit)
变量
timeLimit
不是一个常量表达式。只能指定注释属性(和一个)
在Foo中
public static final int timeLimit;
static{
timeLimit=10000;
}
@Test(timeOut=timeLimit)
变量
timeLimit
不是一个常量表达式。我看不出你的第一段是如何应用的。没有引用另一个类的字段。@SotiriosDelimanolis它来自条件编译的需求。如果您稍后编译一个引用Foo.timeLimit
的类,它应该能够根据已编译的Foo.class
@Manipal确定常量变量的值。请接受Sotirios的答案,而不是我的答案,因为这是正确的。我不知道您的第一段如何适用。没有引用另一个类的字段。@SotiriosDelimanolis它来自条件编译的需求。如果您稍后编译一个引用Foo.timeLimit
的类,它应该能够从已经编译的Foo.class
@Manipal中确定常量变量的值。请接受Sotirios的答案,而不是我的答案,因为那是正确的。您是对的,这应该是公认的答案,因为它给出了为什么它应该是一个常数表达式的完整解释。你是对的,这应该是一个公认的答案,因为它给出了为什么它应该是一个常数表达式的完整解释。