在Java设计中,组合不再被广泛使用了吗?

在Java设计中,组合不再被广泛使用了吗?,java,inheritance,aggregation,composition,Java,Inheritance,Aggregation,Composition,一位Java开发人员(在复杂、高性能的环境中拥有丰富的经验)最近评论说,“组合不再被广泛使用。”我对这一评论感到惊讶。这是真的吗 一方面,本论坛上的其他答案表明,组合和聚合之间的差异可能是不明确的(整体是否存在而不存在部分;部分是否存在于包含对象的整个生命周期中?)。但也许在所有这些情况下,问题都存在——如何向现有类或类层次结构添加行为 他评论的背景是对继承的可能替代方案的讨论。如果这个开发者是正确的,那么在工作实践中是什么取代了合成呢?通过添加的接口进行混合 欢迎任何观点 如果说有什么区别的话

一位Java开发人员(在复杂、高性能的环境中拥有丰富的经验)最近评论说,“组合不再被广泛使用。”我对这一评论感到惊讶。这是真的吗

一方面,本论坛上的其他答案表明,组合和聚合之间的差异可能是不明确的(整体是否存在而不存在部分;部分是否存在于包含对象的整个生命周期中?)。但也许在所有这些情况下,问题都存在——如何向现有类或类层次结构添加行为

他评论的背景是对继承的可能替代方案的讨论。如果这个开发者是正确的,那么在工作实践中是什么取代了合成呢?通过添加的接口进行混合


欢迎任何观点

如果说有什么区别的话,那就是由于像Spring这样的依赖注入框架,它现在的使用可能比以往任何时候都多。我认识的所有Java开发人员都使用的模型是,根据接口和用途构建功能上相互关联的类,并使用Spring根据特定配置注入它们(例如,只需更改Spring配置文件并添加一些新的JAR文件,就可以替换整个安全框架).

有带字段的类吗?对好了,不,绝对是垃圾。事实上,Joshua Bloch非常清楚地说“第16项:支持组合而不是继承”。只要你不太在意最终性能和内存占用,你(和J.Bloch)是对的。然而,在性能关键型软件中,有时最好使用继承,以避免遍历额外引用的惩罚。一个典型的例子是Java7ConcurrentHashMap.Segment类,它扩展了ReentrantLock以节省一些内存并提高性能。出于类似的原因,Java 8 LongAdder、DoubleAccumulator等扩展了辅助Striped64类,而不是生成组合。1+并且也不要忘记Guice.:)非常感谢大家的评论。我将注意到阿潘金对绩效的观察。Mike T关于Spring的评论也非常相关。可能有不使用组合的上下文,但正如你们中的一些人所证实的那样,我的假设是,组合肯定仍然在主流上下文中使用——在Spring和其他注入框架中使用前端和中心。