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;
}
}
TestData.DATA
更改为B
MyTest
MyClass
时,A
仍会收到TestData.DATA
我尝试过的事情:重新启动服务器,eclipsify项目,清理项目,重新启动eclipse,重新启动计算机,手动刷新每个文件。我发现这个工作:
String data = TestData.DATA;
myClass = new MyClass(data);
为什么我不能直接将DATA传递给MyClass构造函数?
我没有收到任何错误消息,当我在setUp
休息时,DATA
的值为“B”,因为我已经更改了它,但当我进入MyClass myVar
时具有值“A”
答案 0 :(得分:4)
您无法更改final
变量。这就是它final
的原因。但是将final
变量传递给函数没有任何问题。实际上,您发布的示例代码运行得很好。
在您的步骤列表中,您说“将数据更改为”B“',尽管您的代码未显示此步骤。但那没关系,因为那一步不会编译。
如果您需要在将final
变量传递给函数之前对其进行更改,则需要制作本地副本并更改该副本。
更新:现在问题已经澄清了,这里有更多想法:
听起来好像没有正确地重新编译。也许你是从旧版本的类运行(即你需要将它复制到某个地方)?
此外,您应该知道虽然您可以更改TestData
类,因为DATA
被声明为static final
,但Java可能已将该常量内联到MyTest
类中(因为它保证永远不会改变)所以你需要确保MyTest
也被重新编译。
如果您想验证您使用的是最新版本的类,请在您知道应该执行的地方放置一些非常“响亮”的代码。例如,System.out.println
或甚至抛出RuntimeException
(当然,您的程序会失败,但如果它没有失败,那么您知道某些内容未被重新编译适当的,这将帮助您诊断出错了。)
答案 1 :(得分:2)
您需要确保在运行之间编译所有.java
文件,Eclipse有一个不同步的缓存。清理项目应该清理你的问题
答案 2 :(得分:1)
更改TestData
类后,必须重新编译其他类。原因是常量表达式在编译时解析,而不是在运行时解析。
答案 3 :(得分:1)
尝试手动清洁,这有用吗?机会是它在编译时的缓存内容,然后在应该的时候不刷新内容。我已经看到Netbeans在静态最终字段上的类似行为,并且清理通常已经解决了它。
如果确实如此,并且完整构建不需要太长时间,那么最简单的事情就是修改ant任务,这样在每次运行之前它都会干净(因此被迫重新编译它的类)需要从头开始。)
答案 4 :(得分:0)
您需要确保将您的类重新编译到服务器从哪里读取类文件。它被缓存在某处,因此是DATA
的旧值。
为什么你说你不能将DATA传递给MyClass构造函数?