我使用的库包含某种对象类型, LackingObject
(某个类型),它缺少类型的属性 Ext
(某种类型)。如果我能改变 LackingObject
类,我只需添加一个类型为 Ext
,但是 LackingObject
不能更改,也不能扩展。我现在用的语言是 C
或者 C++
就是创造一个 Map
那是Map LackingObjects
至 Exts
,在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;
}
但在我看来,这总体上是一个较差的解决方案,因为我们将向项目结构中添加一个潜在的冗余新对象类型,而不是仅仅添加几个语句。
(与主题无关,因为问题的这一部分是针对我目前的状况,但这种“低劣的解决方案”还需要我更改许多已经存在的源代码,如果可能的话,我很乐意避免这些更改。)
2条答案
按热度按时间oyxsuwqo1#
系统识别码
挖掘
IdentityHashMap
(得益于iota的回答),我找到了部分问题的答案:接收对象示例的唯一标识符的方法是什么?
…关键是:
System.identityHashCode
签字人引用javadoc:
为给定对象返回与默认方法hashcode()返回的哈希代码相同的哈希代码,无论给定对象的类是否重写hashcode()。空引用的哈希代码为零。
f2uvfpb92#
你可以用
IdentityHashMap
为此目的。根据其文件:此类使用哈希表实现Map接口,在比较键(和值)时使用引用相等代替对象相等。换句话说,在恒等式hashmap中,两个键k1和k2被认为相等当且仅当(k1==k2)(在普通的map实现(比如hashmap)中,两个键k1和k2被认为是相等的当且仅当(k1==null?k2==null:k1.equals(k2))。)
这个类不是一个通用的Map实现!当这个类实现map接口时,它故意违反map的一般约定,该约定要求在比较对象时使用equals方法。该类仅设计用于少数需要引用相等语义的情况。