gpt4 book ai didi

java - 将没有字段的抽象类转换为接口(interface)(Java,Sonar 规则 s1610)

转载 作者:行者123 更新时间:2023-12-04 17:30:07 26 4
gpt4 key购买 nike

我指的是 this rule :

With Java 8's "default method" feature, any abstract class without direct or inherited field should be converted into an interface.

  • 在我看来,Java8+ 接口(interface)中的默认 + 私有(private)方法是纯粹的妥协 JDK 设计者为了解决他们面临的困境:他们不得不引入新方法(例如 Map 接口(interface))不破坏使用这些接口(interface)的旧代码(向后兼容性)。
  • 在实践中,JDK 设计者在某些地方引入了实现继承接口(interface)继承存在的地方,所以它们可能增加了我们现有和 future 代码的耦合性和脆弱性。
  • 在我看来,引入的实现继承现在削弱了接口(interface)的酷炫特性 - 多重继承
  • 我理解为什么“没有字段的抽象类”在 Sonar 规则中被提及。通过这个规则的作者确实减少了脆弱性(但没有消除实现继承的事实)。与允许字段的 Scala 特征问题相比(新的 Java 接口(interface)看起来越来越像 Scala 的特征)- Scala 语言设计者试图通过特征线性化、惰性 vals 等方式解决这些问题。
  • 我要避免诸如“它在 JDK 中所以它是一种模式”之类的争论,让我们在这里在概念层面上多谈谈。
  • 问题:谁能解释一下为什么 Sonar 提倡这个,恕我直言,有缺陷的规则?这样的规则对我们有什么好处?我在这里缺少什么好处/用例?

谢谢。

最佳答案

我不一定同意这条规则,但我知道它的来源。

关键是在这种情况下你并没有真正失去任何东西。唯一一次遇到与多重继承有关的问题是,如果您实现了多个接口(interface),其中包含具有相同签名和不同实现的方法。

但是,Java 禁止这样做(您需要提供您自己的该方法的实现),因此这样做没有危险。

一般来说,接口(interface)比类更通用,因此尽可能使用它们是有意义的。

作为对比,引入了接口(interface) default 功能,允许在不破坏现有代码的情况下向现有接口(interface)添加方法,但这里不是这种情况。

关于java - 将没有字段的抽象类转换为接口(interface)(Java,Sonar 规则 s1610),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60571099/

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