Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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 无法更改静态最终变量 通过在Eclipse中编辑源代码,将TestData.DATA更改为B 重新启动服务器 运行MyTest MyClass在引用TestData.DATA时仍然接收A_Java_Eclipse_Playframework - Fatal编程技术网

Java 无法更改静态最终变量 通过在Eclipse中编辑源代码,将TestData.DATA更改为B 重新启动服务器 运行MyTest MyClass在引用TestData.DATA时仍然接收A

Java 无法更改静态最终变量 通过在Eclipse中编辑源代码,将TestData.DATA更改为B 重新启动服务器 运行MyTest MyClass在引用TestData.DATA时仍然接收A,java,eclipse,playframework,Java,Eclipse,Playframework,我尝试过的事情:重新启动服务器、eclipse项目、清理项目、重新启动eclipse、重新启动计算机、手动刷新每个文件。我发现这是可行的: public class TestData { public static final String DATA = "A"; // I change this to read DATA = "B" } public class MyTest extends UnitTest { private MyClass myClass; publ

我尝试过的事情:重新启动服务器、eclipse项目、清理项目、重新启动eclipse、重新启动计算机、手动刷新每个文件。我发现这是可行的:

public class TestData {
   public static final String DATA = "A"; // I change this to read DATA = "B"
}

public class MyTest extends UnitTest {
   private MyClass myClass;

   public void setUp() {
      myClass = new MyClass(TestData.DATA); // After change, DATA has value "B"
   }
}

public class MyClass {
   private String myVar;

   public MyClass(String myVar) { // After change, myVar still has value "A"
      this.myVar = myVar;   
   }
}
为什么我不能直接将数据传递给MyClass构造函数


我没有收到任何错误消息,当我在
设置
中断时,
数据
的值为“B”,因为我已经更改了它,但是当我进入MyClass
myVar
时,值为“A”

您不能更改
最终
变量。这就是为什么它是最终的。但是将
final
变量传递给函数没有什么错。事实上,您发布的示例代码运行良好

在步骤列表中,您说过“将数据更改为“B”,但代码中没有显示此步骤。但这很好,因为该步骤无法编译

如果在将变量传递给函数之前需要更改
final
变量,则需要创建一个本地副本并更改该副本

更新:问题已经澄清,下面是一些想法:

听起来好像有些东西没有被正确地重新编译。也许您是从类的旧版本运行的(即,您需要将其复制到某个地方)

另外,您应该知道,尽管您可能会更改
TestData
类,但因为
DATA
声明为
static final
,Java可能已经将该常量内联到
MyTest
类中(因为它保证永远不会更改),所以您需要确保
MyTest
也被重新编译


如果您想验证您使用的是最新版本的类,请将一些非常“响亮”的代码放在您知道它应该执行的位置。例如,一个
系统.out.println
甚至抛出一个
运行时异常
(当然,你的程序会失败,但如果它没有失败,那么你就知道某些东西没有被正确地重新编译,这将帮助你诊断错误)。

你不能更改
final
变量。这就是为什么它是最终的。但是将
final
变量传递给函数没有什么错。事实上,您发布的示例代码运行良好

在步骤列表中,您说过“将数据更改为“B”,但代码中没有显示此步骤。但这很好,因为该步骤无法编译

如果在将变量传递给函数之前需要更改
final
变量,则需要创建一个本地副本并更改该副本

更新:问题已经澄清,下面是一些想法:

听起来好像有些东西没有被正确地重新编译。也许您是从类的旧版本运行的(即,您需要将其复制到某个地方)

另外,您应该知道,尽管您可能会更改
TestData
类,但因为
DATA
声明为
static final
,Java可能已经将该常量内联到
MyTest
类中(因为它保证永远不会更改),所以您需要确保
MyTest
也被重新编译


如果您想验证您使用的是最新版本的类,请将一些非常“响亮”的代码放在您知道它应该执行的位置。例如,一个
System.out.println
甚至抛出一个
RuntimeException
(当然,您的程序会失败,但是如果它没有失败,那么您就知道某些东西没有被正确地重新编译,这将帮助您诊断错误).

您需要确保所有的
.java
文件都是在运行之间编译的,Eclipse有一个缓存有时会不同步。对项目进行清理应该可以解决您的问题

您需要确保所有的
.java
文件都是在运行之间编译的,Eclipse有一个缓存有时会不同步。对项目进行清理应该可以解决您的问题

在更改
TestData
类之后,您必须重新编译其他类。原因是常量表达式在编译时解析,而不是在运行时解析。

更改
TestData
类后,必须重新编译其他类。原因是常量表达式是在编译时解析的,而不是在运行时解析的。

尝试手动清理,可以吗?可能是它在编译时缓存了一些东西,然后在应该刷新的时候不刷新内容。我见过Netbeans在静态final字段上的类似行为,清理通常解决了这一问题


如果这确实证明了这一点,并且完整构建不会花费太长时间,那么最简单的方法可能是修改ant任务,使其在每次运行之前都进行清理(并强制重新编译它需要的类)。

尝试手动清理,可以吗?可能是它在编译时缓存了一些东西,然后在应该刷新的时候不刷新内容。我见过Netbeans在静态final字段上的类似行为,清理通常解决了这一问题


如果这确实证明了这一点,并且完整构建不会花费太长时间,那么最简单的方法可能是修改ant任务,使其在每次运行之前都能进行清理(因此必须从头开始重新编译所需的类)。

您需要确保将类重新编译到服务器读取类文件的任何位置。它缓存在某个地方,因此是
数据的旧值


为什么说不能将数据传递给MyClass构造函数?

您需要确保将类重新编译到服务器读取类文件的位置。它被缓存在某个地方,因此,String data = TestData.DATA; myClass = new MyClass(data);