我有一个多层次的地图要求,我正在使用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下可序列化。

07-24 20:21