【发布时间】:2015-06-02 08:58:40
【问题描述】:
我想扩展 LinkedHashMultimap (Guava 16.0.1),主要是为了添加返回常用预填充地图的方法。
public class MyMap extends LinkedHashMultimap<String, Object> {
}
但是,据我所知,大多数 Guava 集合都是最终的,而那些不是最终的,不会公开公共构造函数。这个设计决定的可能原因是什么?实现我的目标的最佳方法是什么?我能想到的最好的方法是在我的类中包装 Multimap 方法,但这远非理想。
编辑:
一些用户指出了不允许继承的正当理由。为了稍微扩展问题,我想指出几点。
如果公共API不推荐继承,Java自己的集合类怎么不是final的?
假设我广泛使用以下类:
LinkedHashMultimap
现在,这是一口。如果可以的话:
public class ConsumerMap extends LinkedHashMultimap<Class<? extends BaseEntity>, BiConsumer<? extends BaseEntity, ? extends Object>> {
}
然后我可以在我的代码中使用 ConsumerMap 来代替那个怪物。我相信仅可读性就足以证明继承是合理的。
【问题讨论】:
-
装饰模式是你的方式吗?
-
如果我理解正确,您将添加的方法无论如何都没有理由成为实例方法。为什么您需要扩展 LinkedHashMultimap 只是为了提供返回预填充地图的实用方法?组合通常比继承更可取,但在这里,您似乎甚至不需要组合:只需要一个实用程序类。你能提供一个你要添加的方法的例子吗?
-
@JBNizet:我意识到我可以通过实用程序类做到这一点,这样看起来更干净。顺便说一句,我不明白为什么组合比继承更受欢迎。两者都有合法的用例。
-
而且这个用例不是一个合法的用例,既不是继承,也不是组合。关于“偏好组合优于继承”,请阅读books.google.fr/…
-
@JBNizet:在这种情况下,继承不会有危险,因为我只会使用极不可能更改的超类方法,但是,我现在了解阻止继承的原因。