2013-01-24 54 views
4

讓我們從代碼開始。在Java中打印用於調試目的的唯一對象標識

Future<MyResult> obj = getFuture(); 
debugLog.println("Handling future: " + System.identityHashCode(obj); 

然後再在別的地方再次,或者可能是同一段代碼再次執行,可能在不同的線程。

Future<MyResult> obj = getFuture(); 
debugLog.println("Handling future: " + System.identityHashCode(obj); 

現在上面,如果obj是同一個對象,顯然調試打印將是相同的。但是如果它們是不同的,仍然有散列衝突的機會,所以打印輸出可能即使對於不同的對象也是相同的。因此具有相同的輸出(或者更一般地說,相同的字符串)不能保證相同的對象。

問題:有沒有辦法在Java中獲得唯一的ID 字符串對於任意對象?或者更正式,給static String Id.str(Object o)方法,以便使這是總是真:

final Object obj1 = ...; 
final String firstId = Id.str(obj1); 
// arbitrary time passes, garbage collections happen etc. 
// firstId and obj1 are same variables as above 
(firstId.equals(Id.str.obj2)) == (obj1 == obj2) 

回答

7

我認爲,其實沒有這將保證你這樣的對象標識的唯一性的任何方法(即技術)。這種識別的唯一目的是一種解決這個對象在內存中的數據的方法。如果這個對象死亡,然後被GC從內存中移除,沒有人會限制系統使用其以前的地址空間來放置新對象的數據。

但實際上,在某些短時間內,在您的程序中有任何引用的所有可用對象中,System.identityHashCode(obj)實際上會給您唯一的對象的身份。這是因爲這個hashCode是使用對象的內存位置來計算的。但是,它是一個實現功能,沒有爲外部JVM提供記錄和保證。

此外,您還可以閱讀這個著名的QA:Java: How to get the unique ID of an object which overrides hashCode()?

0

假設並不重要這個ID實際上是哈希碼,那麼你可以通過具有分配給每一個Singleton類生成的ID保證一個唯一的ID目的。然後您可以使用該標識符而不是哈希碼。

你的目標是什麼,也許有更好的選擇?

+0

你是如何建議將這些ID從單身人士分配給對象的,這些對象將由三方對象創建? – Andremoniy

+0

對不起,我一定錯過了他說的地方,我假設他正在定義這些課程,因此可以把他喜歡的東西放在其中。 – codeghost

+0

嗯,一個目的就是問題中隱含的內容:查看日誌並查看打印的ID。顯然有一些解決方法,例如在可用時打印某些特定於個案的識別數據。但是當類型是'Future <>'時,這很難。所以我在問是否存在一個通用的解決方案。 – hyde

相關問題