RMI - 在哈希图中引用和使用远程对象作为 "key"

RMI - references and using remote object as a "key" in a hashmap

我有一个 RMI 服务器,它导出实现接口的对象,我们称它为 "TestInterface"。

客户端然后可以执行各种任务,调用此接口上的方法。然后我有一些其他接口用于不同类型的对象,其中一个方法接受类型 "TestInterface" 的对象。该方法尝试使用哈希图,其中 "TestInterface" 是键(它在服务器上存储所有 "TestInterface" 对象的哈希图,值是我想要检索的值),但找不到它.我知道这个key存在于hashmap中,但是由于接口传递给客户端,稍后又返回给服务器,所以好像没有找到。

我知道它存在,因为我能够打印出作为哈希图中键的对象的 ID,以及传入的 "TestInterface" 的 ID(它们相同)。然后我将它们都打印出来(使用默认的 toString),我得到了这个:

Proxy[TestInterface,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[127.0.0.1:1099](remote),objID:[-38c943f9:14be569cb95:-7ff9, 8183237023004091504]]]]]

Test[UnicastServerRef [liveRef: [endpoint:[127.0.0.1:1099](local),objID:[-38c943f9:14be569cb95:-7ff9, 8183237023004091504]]]]

我可以看出它们是不同的,这可能是我无法查找它们的原因。但是,它们看起来指向同一个对象(我相信是这种情况,因为 objectId 是相同的)。

我的问题是,为什么我不能在 hashmap 中查找这个 "Key",其中 Key 是对同一对象的引用。

我的第二个问题是,有解决这个问题的简单方法吗?

发生这种情况是因为您用作键的实际对象与 hashCode()equals() 的计算结果不同。这些是 HashMap 用于查找的方法。处理这个问题的一种常见方法是创建一个包装器 class,它将使用 hashCode()equals() 内部的内部 objId。这个包装器 class 然后用作映射的键​​。

类似于:

public Wrapper {
  private Keyclass key;
  ...

  public Keyclass getWrapped() { return key; }

  @Override
  public int hashCode() {
    return key.objID.hashCode();
  }

  @Override
  public boolean equals(Object o) {
    return key.objID.equals(((Wrapped)o).key.objID);
  }
}