Java 重写HashBiMap实现的getOrDefault

Java 重写HashBiMap实现的getOrDefault,java,guava,bimap,Java,Guava,Bimap,与番石榴图书馆合作。 我想覆盖(添加一些验证)HashBiMap实现的getOrDefault方法。 仔细看,HashBiMap类被声明为final,我不能扩展它。 有什么想法吗 @GwtCompatible(emulated = true) public final class HashBiMap<K, V> extends IteratorBasedAbstractMap<K, V> implements BiMap<K, V>, Serializ

与番石榴图书馆合作。 我想覆盖(添加一些验证)HashBiMap实现的getOrDefault方法。 仔细看,HashBiMap类被声明为final,我不能扩展它。 有什么想法吗

@GwtCompatible(emulated = true)
public final class HashBiMap<K, V> extends IteratorBasedAbstractMap<K, V>
    implements BiMap<K, V>, Serializable {
....
}
@GwtCompatible(仿真=真)
公共最终类HashBiMap扩展了迭代器BaseDabstractMap
实现BiMap,可序列化{
....
}
在您的
HashBiMap
周围创建一个装饰器以进行验证。 番石榴推广了这个概念,简化了大多数收藏类型的装饰图案

通过子类化
ForwardingXXX
并实现
delegate()
方法,您可以只覆盖目标类中选定的方法,添加修饰的功能,而不必自己委托每个方法

但由于某些原因,作者还没有向我们提供一个
转发BIMAP
。所以我会自己创建(一个基本的)一个,或者等待问题解决。如果要创建自己的,只需执行以下操作:

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);
  // }

}
公共抽象类转发BiMap实现BiMap{
受保护的抽象BiMap委托();
//使用以下模式实现*所有*其他方法:
//ReturnType方法(ParamType-param){
//返回委托().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验证(BiMap委托){
对象。requirennull(委托);
返回新的ForwardingBiMap(){
@重写受保护的BiMap委托(){return delegate;}
@覆盖公共V getOrDefault(对象键,V defaultValue){
//在这里实现您自己的验证
返回super.getOrDefault(key,defaultValue);
}
};
}
然后最后使用它:

BiMap<String,String> backingBiMap = HashBiMap.create();
BiMap<String,String> validatingBiMap = ValidatingBiMap.validating(backingBiMap);
validatingBiMap.getOrDefault("Hello", "World");
BiMap backingBiMap=HashBiMap.create();
BiMap validatingBiMap=验证BiMap.validating(backingBiMap);
验证bimap.getOrDefault(“你好”,“世界”);

(目前,我建议对ForwardingMap进行子类化,实现BiMap,并使用另一个ForwardingMap来实现Reverse。正如本期中提到的,对于ForwardingBiMap的大多数应用程序,这可能是任何人都能做的最好的事情…)