从guava集合中对HashBasedTable进行子类化

时间:2015-03-30 14:46:17

标签: java gwt guava

我有多级地图要求,我正在使用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
*/
  ....
}
  1. 这种做法是否正确?如果不是,你能列出问题吗?任何替代方法?

  2. HashBasedTable Gwt序列化兼容吗?我问,因为HashBasedTable内部使用的两个备份映射都使用@GwtTransient注释进行了注释。

1 个答案:

答案 0 :(得分:6)

广告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下是可序列化的。