独特的java对象 - 运行和调试中的不同行为

时间:2014-02-13 18:39:15

标签: java

我正在开发一个依赖于唯一对象的程序。我在2个地方使用同一个对象,当在一个地方完成更新时,这应该反映在另一个地方。

如果我调试程序(在eclipse中),一切正常。我的2个对象引用了同一个对象的两个点(ojbect1==object2返回true)。如果我运行完全相同的程序(在eclipse中),两个引用中都有不同的对象(相同的比较显示false)。

此对象多次实例化,但其中一个实例保存在TreeMap中,稍后会被拾取。但是,当我拿起它时,有时(如上所述)它是一个不同的对象,在此期间不会对原始对象进行任何更改。

有人知道为什么会这样吗?

我不能在较小的范围内复制问题,所以不幸的是我不能在这里发布代码。

3 个答案:

答案 0 :(得分:1)

您不应该将Object.hashCode()用作地图中的关键字,因为它不能保证是唯一的。

您的对象中是否有某些内容可以唯一标识它?如果是这样,那么使用它作为关键。如果没有,则创建合成密钥(例如,通过递增计数器并将值存储在对象中)。

答案 1 :(得分:0)

如果您需要程序具有给定类的单个实例,则应实现Singleton模式。

建议的方法是执行此操作,因为java 5是定义只包含一个元素的枚举类型,如:

public enum MyEnum { 
  MY_SINGLETON_INSTANCE;

  // business logic, etc.

 }

这是(至少根据Josh Bloch;))确保对象实例是唯一的最简单,最安全的方法,无论你做什么都无关紧要。

以下是关于此主题的更广泛,更完整的讨论:

Implementing the singleton pattern in Java

答案 2 :(得分:0)

最终,我发现这个问题是多线程的。显然,我正在调用“保存”我需要在多个线程中共享多次的对象的方法(一次我需要它,一次在用户输入时运行的验证例程中)。如果验证线程在我保存对象的主线程之间激活并稍后再次拾取,则保存的对象引用被覆盖。在调试模式下,我一步一步地运行我的程序,所以其他线程已经完成,或者被调试器停止(不知道这在eclipse中是如何工作的)。修复是为了确保我只在需要时保存对象,只允许从我需要它的地方写入这个“已保存”的对象。