gpt4 book ai didi

java - 继承、组合和默认方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:34 25 4
gpt4 key购买 nike

通常承认通过继承扩展接口(interface)的实现不是最佳实践,并且组合(例如,从头开始重新实现接口(interface))更易于维护。

这是可行的,因为接口(interface)契约强制用户实现所有需要的功能。但是在 Java 8 中,默认方法提供了一些可以“手动”覆盖的默认行为。考虑以下示例:我想设计一个用户数据库,它必须具有列表的功能。为了提高效率,我选择用 ArrayList 来支持它。

public class UserDatabase extends ArrayList<User>{}

这通常不会被认为是很好的实践,如果真的想要 List 的全部功能并遵循通常的“组合优于继承”的座右铭,人们会更喜欢:

public class UserDatabase implements List<User>{
//implementation here, using an ArrayList type field, or decorator pattern, etc.
}

但是,如果不注意的话,有些方法,比如spliterator()是不需要重写的,因为它们是List接口(interface)的默认方法。问题是,List 的 spliterator() 方法比 ArrayList 的 spliterator() 方法性能差得多,后者针对 ArrayList 的特定结构进行了优化。

这迫使开发者

  1. 注意ArrayList有自己的更高效的spliterator()实现,手动重写他自己实现的List或的spliterator()方法
  2. 使用默认方法会损失大量性能。

所以问题是:在这种情况下,人们应该更喜欢组合而不是继承,这仍然是“真实的”吗?

最佳答案

在开始考虑性能之前,我们始终应该考虑正确性,即在您的问题中,我们应该考虑使用继承而不是委托(delegate)意味着什么。 this EclipseLink/ JPA issue 已经说明了这一点.由于继承,如果延迟填充列表尚未填充,则排序(同样适用于流操作)将不起作用。

所以我们必须在特化、覆盖新的 default 的可能性之间进行权衡。方法,在继承情况下完全中断,并且 default 的可能性在委托(delegate)情况下,方法无法发挥最大性能。我想,答案应该是显而易见的。

由于您的问题是关于新的 default 是否方法改变情况,应该强调的是,与以前甚至不存在的东西相比,你正在谈论性能下降。让我们留在sort例子。如果您使用委托(delegate)并且不覆盖 default排序方法,default方法的性能可能低于优化的 ArrayList.sort方法,但在 Java 8 之前,后者不存在,并且算法未针对 ArrayList 进行优化是标准行为。

因此,当您不覆盖 default 时,Java 8 下的委托(delegate)不会失去性能,您只是不会获得更多的性能。方法。我认为,由于其他改进,性能仍将优于 Java 7(没有 default 方法)。

Stream API 不容易比较,因为该 API 在 Java 8 之前不存在。但是,很明显,类似的操作,例如如果您手动实现减少,除了通过 Iterator 别无选择。您的代表团名单中有哪些必须防范remove()尝试,因此包装 ArrayList Iterator ,或使用 size()get(int)哪个委托(delegate)给靠山List .所以没有预 default 的场景方法 API 可以表现出比 default 更好的性能Java 8 API 的方法,因为没有 ArrayList - 过去的特定优化。

也就是说,可以通过以不同的方式使用组合 来改进您的 API 设计:不让 UserDatabase实现 List<User>根本。只需提供 List通过访问器方法。然后,其他代码将不会尝试流过 UserDatabase实例但在访问器方法返回的列表上。返回的列表可能是 read only wrapper它提供最佳性能,因为它由 JRE 本身提供,并注意覆盖 default可行的方法。

关于java - 继承、组合和默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31242036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com