gpt4 book ai didi

用于唯一对象实例的 Java Map?

转载 作者:行者123 更新时间:2023-12-05 08:48:46 24 4
gpt4 key购买 nike

我使用的库包含特定对象类型 LackingObject(某种类型),它缺少类型 Ext(某种类型)的属性。如果我能够更改 LackingObject 类,我会简单地添加一个类型为 Ext 的属性,但是 LackingObject 不能更改,也不能扩展。我现在用 CC++ 这样的语言做的是创建一个 MapLackingObjects 映射到 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 行为是将 Object::hashCode 而不是 Objects 的结果映射到值,所以如果我有两个(除了 Ext 值)equal LackingObjects,它们不能都是 中的唯一键>java.util.HashMap.

问题:在Java中,是否至少存在以下一种情况:

  • 一种让标准库将对象实例映射到值的方法?

  • 接收对象实例的唯一标识符的方法?

我发现了一个 7 年前的帖子与这个主题有些相关,但我希望这些年来情况有所改变。

最后的办法是创建一个包装类,

class Wrapper{
LackingObject o;
Ext v;
}

但在我看来,总的来说这是一个较差的解决方案,因为我们将向项目结构中添加一个潜在冗余的新对象类型,而不是仅仅添加一些语句。

(与主题无关,因为这部分问题是针对我目前的情况,但这种“劣质解决方案”还需要我更改大量已经存在的源代码,如果可能的话,我很乐意避免这样做.)

最佳答案

您可以使用 IdentityHashMap以此目的。根据其文档:

This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)
This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map's general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.

关于用于唯一对象实例的 Java Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65532643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com