覆盖HashBiMap实现的getOrDefault

问题描述 投票:1回答:1

使用Guava库。我想重写(添加一些验证)HashBiMap实现的getOrDefault方法。研究它,将HashBiMap类声明为final,我无法对其进行扩展。有什么主意吗?

@GwtCompatible(emulated = true)
public final class HashBiMap<K, V> extends IteratorBasedAbstractMap<K, V>
    implements BiMap<K, V>, Serializable {
....
}
java guava bimap
1个回答
1
投票

HashBiMap周围创建装饰器以进行验证。

Guava推广了Forwarding* helper classes概念以简化集合的装饰器模式。

通过子类化Forwarding*并实现ForwardingXXX方法,您可以仅覆盖目标类中的选定方法,从而添加修饰的功能,而不必自己委派每个方法。

但是由于某些原因,作者尚未向我们提供delegate()。因此,我将自己创建一个或在ForwardingBiMap上创建一个问题:

their GitHub project

然后实现您自己的ValidatingBiMap:

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 class ValidatingBiMap<K, V> extends forwardingBiMap<K, V> {

  public static ValidatingBiMap<K,V> validating(BiMap<K,V> delegatee) {
    return new ValidatingBiMap<>();
  }

  private final BiMap<K,V> delegate;

  ValidatingBiMap(BiMap<K,V> delegate) { this.delegate = delegate; }

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

  public V getOrDefault(Object key, V defaultValue) {
    // Write all your validation here!
    return super.delegate().getOrDefault(key, defaultValue);
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.