使用Guava库。我想重写(添加一些验证)HashBiMap实现的getOrDefault方法。研究它,将HashBiMap类声明为final,我无法对其进行扩展。有什么主意吗?
@GwtCompatible(emulated = true)
public final class HashBiMap<K, V> extends IteratorBasedAbstractMap<K, V>
implements BiMap<K, V>, Serializable {
....
}
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);
}
}