唯一对象示例的javaMap?

wh6knrhe  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(287)

我使用的库包含某种对象类型, LackingObject (某个类型),它缺少类型的属性 Ext (某种类型)。如果我能改变 LackingObject 类,我只需添加一个类型为 Ext ,但是 LackingObject 不能更改,也不能扩展。我现在用的语言是 C 或者 C++ 就是创造一个 Map 那是Map LackingObjectsExts ,在java中,它(相当于)看起来

Map<LackingObject, Ext> object_extension = new HashMap<>();

所以每当我遇到 LackingObject 在我的代码里,我第一次可以

LackingObject o = ...;
Ext value = compute_value_for(o, ...);
object_extension.put(o, value);

然后,为了回忆这个附加属性,我会调用

Ext resolved = object_extension.get(o);

但是,默认情况下,这将不起作用 HashMap 行为就是Map结果 Object::hashCode ,不是 Objects ,到值,所以如果我有两个(除了 Ext 值)
equal LackingObjects ,它们不能都是 java.util.HashMap .
问题是:在java中,是否至少存在以下一种情况:
一种让标准库将对象示例Map到值的方法?
接收对象示例的唯一标识符的方法?
我发现一篇7年前的帖子和这个主题有些关联,但我希望这几年事情有所改变。
最后的办法是创建一个 Package 器类,

class Wrapper{
    LackingObject o;
    Ext v;
}

但在我看来,这总体上是一个较差的解决方案,因为我们将向项目结构中添加一个潜在的冗余新对象类型,而不是仅仅添加几个语句。
(与主题无关,因为问题的这一部分是针对我目前的状况,但这种“低劣的解决方案”还需要我更改许多已经存在的源代码,如果可能的话,我很乐意避免这些更改。)

oyxsuwqo

oyxsuwqo1#

系统识别码

挖掘 IdentityHashMap (得益于iota的回答),我找到了部分问题的答案:
接收对象示例的唯一标识符的方法是什么?
…关键是: System.identityHashCode 签字人

int identityHashCode(Object);

引用javadoc:
为给定对象返回与默认方法hashcode()返回的哈希代码相同的哈希代码,无论给定对象的类是否重写hashcode()。空引用的哈希代码为零。

f2uvfpb9

f2uvfpb92#

你可以用 IdentityHashMap 为此目的。根据其文件:
此类使用哈希表实现Map接口,在比较键(和值)时使用引用相等代替对象相等。换句话说,在恒等式hashmap中,两个键k1和k2被认为相等当且仅当(k1==k2)(在普通的map实现(比如hashmap)中,两个键k1和k2被认为是相等的当且仅当(k1==null?k2==null:k1.equals(k2))。)
这个类不是一个通用的Map实现!当这个类实现map接口时,它故意违反map的一般约定,该约定要求在比较对象时使用equals方法。该类仅设计用于少数需要引用相等语义的情况。

相关问题