【发布时间】:2014-04-30 18:40:46
【问题描述】:
一位 Java 开发人员(在复杂的高性能环境中拥有丰富的经验)最近评论说 “组合不再使用太多了。”我对这个评论感到惊讶。这是真的吗?
一方面,该论坛上的其他答案表明组合和聚合之间的差异可能是模棱两可的(整体可以没有部分而存在;部分是否存在于包含对象的整个生命周期中?)。但也许在所有这些情况下,问题都存在——如何将行为添加到现有的类或类层次结构中。
他评论的上下文是对继承的可能替代方案的讨论。如果这个开发者是正确的,那么在工作实践中是什么取代了作曲?通过添加的接口混入?
欢迎任何观点!
【问题讨论】:
-
你有带字段的课程吗?是的?给你。
-
不,绝对是垃圾。事实上,Joshua Bloch 很清楚地说“第 16 条:优先组合而不是继承”。
-
您(和 J.Bloch)是对的,只要您不太关心最终性能和内存占用。然而,在性能关键的软件中,有时最好使用继承以避免遍历额外引用的惩罚。一个典型的例子是 Java 7 ConcurrentHashMap.Segment 类,它扩展了 ReentrantLock 以节省一些内存并提高性能。出于类似的原因,Java 8 LongAdder、DoubleAccumulator 等扩展了辅助 Striped64 类而不是进行组合。
标签: java inheritance aggregation composition