簡體   English   中英

在 Java 中打印用於調試目的的唯一對象標識

[英]Printing unique object identity for debugging purposes in 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)

我認為,實際上沒有任何方法(即技術)可以保證對象 ID 的這種唯一性。 這種標識的唯一目的是一種尋址內存中該對象數據的方法。 如果這個對象死了,然后被 GC 從內存中刪除,沒有人會限制系統使用它以前的地址空間來放置新的對象數據。

但實際上,在程序內部有任何引用的所有可用對象中的一段很短的時間內, System.identityHashCode(obj)實際上會為您提供對象的唯一標識。 這是因為這個hashCode是使用對象的內存位置計算的。 但是,它是一個實現特性,對於外部 JVM 沒有記錄和保證。

此外,您可以閱讀這個著名的 QA: Java:如何獲取覆蓋 hashCode() 的對象的唯一 ID?

假設此 ID 實際上是哈希碼並不重要,那么您可以通過讓單例類生成分配給每個對象的 ID 來保證唯一的 ID。 然后您可以使用該標識符而不是哈希碼。

您的目標是什么,也許有更好的解決方案?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM