【问题标题】:Printing unique object identity for debugging purposes in Java在 Java 中为调试目的打印唯一的对象标识
【发布时间】:2013-01-24 11:13:51
【问题描述】:

让我们从代码开始。

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 string?或者更正式地说,给出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)

【问题讨论】:

    标签: java object identity uniqueidentifier


    【解决方案1】:

    我认为,实际上没有任何方法(即技术)可以保证对象 ID 的这种唯一性。这种识别的唯一目的是一种寻址该对象在内存中的数据的方法。万一这个对象死了,然后被 GC 从内存中删除,没有人会限制系统使用它以前的地址空间来放置新的对象的数据。

    但事实上,在您的程序中有任何引用的所有可用对象中,System.identityHashCode(obj) 实际上会为您提供对象的唯一标识。这是因为这个hashCode 是使用对象的内存位置计算的。但是,它是一个实现特性,没有文档记录,也不保证对于外国 JVM。

    另外,您可以阅读这篇著名的 QA:Java: How to get the unique ID of an object which overrides hashCode()?

    【讨论】:

      【解决方案2】:

      假设此 ID 实际上是哈希码并不重要,那么您可以通过让 Singleton 类生成分配给每个对象的 ID 来保证唯一 ID。然后,您可以使用该标识符而不是哈希码。

      你的目标是什么,也许有更好的解决方案?

      【讨论】:

      • 您建议如何将此类 ID 从单例分配给将由 3d 方对象创建的对象?
      • 抱歉,我一定错过了他说的地方,我假设他正在定义类,因此可以将他喜欢的内容放入其中。
      • 嗯,一个目的是问题中隐含的内容:查看日志并查看打印的 ID。显然有一些变通方法,例如在可用时打印一些特定于案例的识别数据。但是当类型类似于Future&lt;&gt; 时,这很难。所以我问是否存在通用解决方案。
      • 对不起,不是要扩展这一行,因为显然这不是你想要的,但鉴于 Future 是通用的,我推断它是你关心的返回结果的类型,并且错误地假设那些将是你的对象。如果您需要它在任何和所有类中工作,尤其是包括那些您尚未生成的类,那么这是不可能的,并且由于您没有查看哈希码实现,因此发生冲突的可能性会增加。
      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2023-02-06
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多