2014-02-13 20 views
1

我正在研究依賴於唯一對象的程序。我在兩個地方使用同一個對象,並且在一個地方完成更新時,這應該反映在另一個地方。獨特的java對象 - 運行和調試中的不同行爲

如果我調試程序(在eclipse中),一切正常。我的兩個對象引用都指向同一個對象(ojbect1==object2返回true)。如果我運行完全相同的程序(在eclipse中),則兩個參考文件中都有不同的對象(相同的比較顯示爲false)。

該對象被多次實例化,但其中一個實例保存在TreeMap中並稍後拾取。但是,當我撿起它時,有時(如上所述)它是一個不同的對象,在此期間不會對原始對象進行任何更改。

有沒有人有這個想法?

我不能在較小的範圍內複製問題,所以很遺憾我無法在此處發佈代碼。

+0

所以,只有當你在eclipse之外運行時纔會出現問題?或只有在發佈模式下運行它? –

+2

Object.hashCode()在調試器中檢查唯一性(==,不是.equals())是不可靠的。使用System.identityHashCode()。這幾乎是正確的。 –

+0

你確定你的hashCode()不是罪魁禍首嗎? – codeMan

回答

0

最終,我發現問題是多線程。顯然,我在調用「保存」我需要在多個線程中共享多次的對象的方法(一次我需要它的地方,一次在用戶輸入時運行的驗證例程中)。如果驗證線程在我的主線程之間激活,保存對象並稍後再次拾取對象,則保存的對象引用將被覆蓋。在調試模式下,我一步一步地運行我的程序,所以其他線程已經完成了,或者被調試器暫停了(不知道在eclipse中它是如何工作的)。修復是爲了確保我只在需要時才保存對象,只允許從我需要的地方寫入這個「保存」對象。

0

如果你需要你的程序有一個給定類的單個實例,你應該實現一個Singleton模式。

推薦的方法來做到這一點,因爲Java 5的是僅具有一個元素定義枚舉類型,像:

public enum MyEnum { 
    MY_SINGLETON_INSTANCE; 

    // business logic, etc. 

} 

這是(至少根據喬希布洛赫;))的最簡單和最安全的確保你的對象實例是唯一的,不管你做什麼。

下面是關於這一主題更廣泛,更全面的討論:

Implementing the singleton pattern in Java

+0

我正在使用此對象的多個實例,但希望在多個位置共享這些實例之一。枚舉不會允許這個(有多個實例)。 – tb189

+0

我很抱歉,我誤解了你。可能jdigital的想法值得看看 –

1

你不應該使用Object.hashCode()在地圖中的關鍵,因爲它不能保證是唯一的。

你的對象中是否存在唯一標識它的東西?如果是這樣,那就用它作爲關鍵。如果不是,則創建一個合成密鑰(例如,通過遞增計數器並將該值存儲在對象中)。

+0

我沒有使用hashCode()作爲鍵,很抱歉,如果我的問題引發了這種混淆。我只是在System.out中使用hashCode()來查看我的2個引用是否指向同一個對象。 – tb189

+0

你確定你使用的密鑰是唯一的嗎? – jdigital

+0

我使用Enum的3個不同值作爲鍵。儘管如此,即使它們不是,在運行模式下也會出現與在調試模式下相同的行爲... – tb189

相關問題