我正在开发一个依赖于唯一对象的程序。我在2个地方使用同一个对象,当在一个地方完成更新时,这应该反映在另一个地方。
如果我调试程序(在eclipse中),一切正常。我的2个对象引用了同一个对象的两个点(ojbect1==object2
返回true
)。如果我运行完全相同的程序(在eclipse中),两个引用中都有不同的对象(相同的比较显示false
)。
此对象多次实例化,但其中一个实例保存在TreeMap中,稍后会被拾取。但是,当我拿起它时,有时(如上所述)它是一个不同的对象,在此期间不会对原始对象进行任何更改。
有人知道为什么会这样吗?
我不能在较小的范围内复制问题,所以不幸的是我不能在这里发布代码。
答案 0 :(得分:1)
您不应该将Object.hashCode()
用作地图中的关键字,因为它不能保证是唯一的。
您的对象中是否有某些内容可以唯一标识它?如果是这样,那么使用它作为关键。如果没有,则创建合成密钥(例如,通过递增计数器并将值存储在对象中)。
答案 1 :(得分:0)
如果您需要程序具有给定类的单个实例,则应实现Singleton模式。
建议的方法是执行此操作,因为java 5是定义只包含一个元素的枚举类型,如:
public enum MyEnum {
MY_SINGLETON_INSTANCE;
// business logic, etc.
}
这是(至少根据Josh Bloch;))确保对象实例是唯一的最简单,最安全的方法,无论你做什么都无关紧要。
以下是关于此主题的更广泛,更完整的讨论:
答案 2 :(得分:0)
最终,我发现这个问题是多线程的。显然,我正在调用“保存”我需要在多个线程中共享多次的对象的方法(一次我需要它,一次在用户输入时运行的验证例程中)。如果验证线程在我保存对象的主线程之间激活并稍后再次拾取,则保存的对象引用被覆盖。在调试模式下,我一步一步地运行我的程序,所以其他线程已经完成,或者被调试器停止(不知道这在eclipse中是如何工作的)。修复是为了确保我只在需要时保存对象,只允许从我需要它的地方写入这个“已保存”的对象。