我有一个多层次的地图要求,我正在使用Guava Table。更确切地说是HashBasedTable。
由于我的代码需要对此数据集进行大量自定义处理,因此我想实现一个派生类,例如EventActionRuleTable拥有一个针对源的Event-Action对象的映射。
像这样的东西
HashMap<Source , Map<Event, Action> ruleMap ;
我将上述内容替换为
Table<Source, Event , Action> ruleTable = HashBasedTable.create();
但是要保留我所有的自定义代码,我想将HashBasedTable子类化,并发现根本不可能。
因此,我选择与一名代表去,即
public EventActionRule extends Table<Source, Event, Action>{
private HashBasedTable<Source, Event, Action> backup = null ;
public HashBasedTable<Source, Event, Action> getBackupTable() {
if (backupTable == null) {
backupTable = HashBasedTable.create() ;
}
return backupTable;
}
@Override
public boolean isEmpty() {
return getBackupTable().isEmpty();
}
/**
All other methods of Table interface overridden to delegate calls to backup instance
*/
....
}
这种方法正确吗?如果没有,您可以列出问题吗?还有其他方法吗?
HashBasedTable Gwt序列化兼容吗?我问,因为在HashBasedTable内部使用的两个备份映射都用@GwtTransient注释进行了注释。
最佳答案
广告1。您的方法是正确的,尽管您可以使用内置的Guava解决方案来使用委托-Forwarding Decorators:
对于所有各种收集接口,Guava提供了Forwarding抽象类以简化使用decorator pattern的过程。
就您而言,ForwardingTable
正在等待您:
public static class EventActionRule extends ForwardingTable<Source, Event, Action> {
private Table<Source, Event, Action> delegate = HashBasedTable.create();
@Override
protected Table<Source, Event, Action> delegate() {
return delegate;
}
// just an example: isEmpty (and other methods) is ready to be overriden
@Override
public boolean isEmpty() {
boolean isEmpty = delegate().isEmpty();
System.out.println("Was map empty? " + isEmpty);
return isEmpty;
}
}
广告。 2.是的,HashBasedTable在GWT下可序列化。