Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从静态块或方法初始化静态final int并在注释中使用它_Java_Spring_Junit_Testng - Fatal编程技术网

Java 从静态块或方法初始化静态final int并在注释中使用它

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

我有以下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类说应该给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的答案,而不是我的答案,因为那是正确的。您是对的,这应该是公认的答案,因为它给出了为什么它应该是一个常数表达式的完整解释。你是对的,这应该是一个公认的答案,因为它给出了为什么它应该是一个常数表达式的完整解释。