您好,我看了这个,我明白了为什么会出现这种情况get
。基本上,这些类:
- 从 AbstractTable 继承;
- 它不会覆盖该
V get
方法;
- 在
rowmap()
实施过程中,使用copyOf
或ImmutableMap.of
因此,基于这些标准,我可以找到那些具有在内部创建新闻地图的相同行为的类:
因此,尝试总结我的发现:在 AbstractTable 类中每次使用 rowMap()(+columnMap()) 方法都有可能创建额外的对象,而对于此类方法的实现来说,这些对象似乎没有必要,例如:containsRow, containsColumn, containsValue, contains, get
对于 ImmutableTable 实现;
我最初的想法是,它的rowMap
和columnMap
方法承担了以下责任:
- 提供外部数据(可以是可变或不可变数据)
- 在内部提供访问数据的支持。
也就是说,我可以看到这种可能的方法:有一种内部方法可以rowMap/columnMap
从 ImmutableTable 类访问受保护的类范围,这样我们就可以通过这个方法实现这些方法,避免创建不必要的对象;
就像是
public abstract class ImmutableTable<R, C, V> extends AbstractTable<R, C, V> {
....
protected abstract ImmutableMap<R, ImmutableMap<C, V>> immutableRowMap();
@Override
public boolean containsRow(@Nullable Object rowKey) {
return Maps.safeContainsKey(immutableRowMap(), rowKey);
}
...
}
final class DenseImmutableTable<R, C, V> extends RegularImmutableTable<R, C, V> {
@Override
protected ImmutableMap<R, ImmutableMap<C, V>> immutableRowMap() {
return this.rowMap;
}
想法@kluever / @ronshapiro?