在Java中打印用于调试目的的唯一对象标识

在Java中打印用于调试目的的唯一对象标识,java,object,identity,uniqueidentifier,Java,Object,Identity,Uniqueidentifier,让我们从代码开始 Future<MyResult> obj = getFuture(); debugLog.println("Handling future: " + System.identityHashCode(obj); 我认为,实际上没有任何方法(即技术)可以保证对象ID的唯一性。这种标识的唯一目的是在内存中寻址该对象的数据。如果这个对象死亡,然后被GC从内存中删除,没有人会限制系统使用它以前的地址空间来放置新对象的数据 但事实上,在程序中有任何引用的所有可用对象中,在一段

让我们从代码开始

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

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

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


另外,您可以阅读这篇著名的QA:

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


你的目标是什么,也许有更好的独处?

以及你建议如何将这样的ID从单例分配到将由3d party对象创建的对象?抱歉,我一定没有听清他说的话,我假设他正在定义类,因此可以将他喜欢的内容放入其中。好吧,一个目的是问题中隐含的含义:查看日志并查看打印的ID。显然,有一些变通办法,例如在有特定情况的识别数据时打印这些数据。但当类型类似于未来时,这就很难了。所以我问是否存在一个通用的解决方案。很抱歉,我无意扩展这一行,因为这显然不是您想要的,但鉴于未来是通用的,我推断这是您关心的返回结果的类型,并且错误地假设这些将是您的对象。如果您需要在任何类和所有类之间使用该方法,尤其是在您尚未生成的类之间,那么这是不可能的,并且冲突的可能性会增加,因为您无法查看hashcode实现。
Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
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)