无法更改静态最终变量

时间:2011-08-02 19:48:12

标签: java eclipse playframework

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;   
   }
}
  1. 通过编辑Eclipse中的源代码
  2. TestData.DATA更改为B
  3. 重新启动服务器
  4. 运行MyTest
  5. 引用MyClass 时,
  6. A仍会收到TestData.DATA
  7. ???
  8. 我尝试过的事情:重新启动服务器,eclipsify项目,清理项目,重新启动eclipse,重新启动计算机,手动刷新每个文件。我发现这个工作:

    String data = TestData.DATA;
    myClass = new MyClass(data);
    

    为什么我不能直接将DATA传递给MyClass构造函数?

    我没有收到任何错误消息,当我在setUp休息时,DATA的值为“B”,因为我已经更改了它,但当我进入MyClass myVar时具有值“A”

5 个答案:

答案 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构造函数?