1

使用 Guava 库。我想覆盖(添加一些验证) HashBiMap 实现的 getOrDefault 方法。调查一下,HashBiMap 类被声明为 final,我不能扩展它。任何想法?

@GwtCompatible(emulated = true)
public final class HashBiMap<K, V> extends IteratorBasedAbstractMap<K, V>
    implements BiMap<K, V>, Serializable {
....
}
4

1 回答 1

2

在您周围创建一个装饰器HashBiMap以进行验证。

Guava 推广了Forwarding*助手类的概念,以简化大多数集合类型的装饰器模式。

通过子类ForwardingXXX化和实现该delegate()方法,您可以仅覆盖目标类中选定的方法,添加装饰功能,而无需自己委托每个方法。

但出于某种原因,作者还没有为我们提供ForwardingBiMap。所以我会自己创建(一个基本的)一个,或者等待关于失踪的问题ForwardingBiMap得到解决。如果您想创建自己的,只需执行以下操作:

public abstract class ForwardingBiMap<K,V> implements BiMap<K,V> {

  protected abstract BiMap<K,V> delegate();

  // implement *all* other methods with the following pattern:
  // ReturnType method(ParamType param) {
  //   return delegate().method(param);
  // }

}

然后实施您的验证:

public static <K,V> BiMap<K, V> validating(BiMap<K,V> delegate) {
  Objects.requireNonNull(delegate);
  return new ForwardingBiMap<K,V>() {

    @Override protected BiMap<K,V> delegate() { return delegate; }

    @Override public V getOrDefault(Object key, V defaultValue) {
      // Implement your own validation here
      return super.getOrDefault(key, defaultValue);
    }
  };
}

然后最后使用它:

BiMap<String,String> backingBiMap = HashBiMap.create();
BiMap<String,String> validatingBiMap = ValidatingBiMap.validating(backingBiMap);
validatingBiMap.getOrDefault("Hello", "World");
于 2020-05-18T17:26:31.077 回答