【问题标题】:Subclassing HashBasedTable from guava collection从番石榴集合中继承 HashBasedTable
【发布时间】:2015-03-30 14:46:16
【问题描述】:

我有一个多级地图要求,我正在使用 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 注释进行了注释。

【问题讨论】:

    标签: java gwt guava


    【解决方案1】:

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

    【讨论】:

    • 请注意:您根本不必用ForwardingTable 覆盖isEmpty(),除非您需要更改其行为。 return delegate().isEmpty() 是默认情况下会执行的操作。
    • @Xaerxess 出现了一个问题 - 那么在内部备份地图上应用 GwtTransient 注释的目的是什么?
    • @ColinD 当然,我并不是要建议覆盖 isEmpty 是强制性的,我编辑了我的答案以澄清这一点。
    • @Gautam 老实说,我不知道。它在 Guava 中的文档说:私人替换 com.google.gwt.user.client.rpc.GwtTransient 以解决构建系统的怪癖。这个注解应该只在com.google.common.collect中使用。我认为这只是一个实现细节,但也许@ColinD可以更准确地回答这个问题。
    • @Gautam @Xaerxess: HashBasedTable 被标记为 @GwtCompatible(serializable = true),所以它是 GWT 可序列化的。至于为什么 GWT 的字段是瞬态的,该类有一个自定义 GWT 序列化器:HashBasedTable_CustomFieldSerializer
    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多