【问题标题】:In Java design is composition not used much anymore? [closed]在 Java 设计中,组合不再使用了吗? [关闭]
【发布时间】: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


【解决方案1】:

如果有的话,由于 Spring 这样的依赖注入框架,它现在可能比以往任何时候都使用得更多。我认识的所有 Java 开发人员使用的模型是构建更多通过接口和目的在功能上相互关联的类,并使用 Spring 根据特定配置注入它们(例如,只需通过更改 spring 配置文件并添加一些新的 JAR 文件)。

【讨论】:

  • 1+ 并且不要忘记 Guice。 :)
  • 非常感谢你们的 cmets。我会注意 apangin 对性能的观察。 Mike T 对 Spring 的评论也非常相关。可能存在不使用组合的上下文,但正如你们中的一些人证实我的假设,组合肯定仍然在主流上下文中使用——以及 Spring 和其他注入框架中的前端和中心。
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多