Java 无法更改静态最终变量 通过在Eclipse中编辑源代码,将TestData.DATA更改为B 重新启动服务器 运行MyTest MyClass在引用TestData.DATA时仍然接收A
我尝试过的事情:重新启动服务器、eclipse项目、清理项目、重新启动eclipse、重新启动计算机、手动刷新每个文件。我发现这是可行的: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
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”,因为我已经更改了它,但是当我进入MyClassmyVar
时,值为“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);