【问题标题】:Java interfaces. Default methods. Backward compatibility [duplicate]Java 接口。默认方法。向后兼容性 [重复]
【发布时间】:2019-01-24 12:54:54
【问题描述】:

我的意思是,java 8 接口中提供的默认方法可以减少应该在实现中编写的代码。天气晴朗。但我不明白这一点,为什么将这个功能添加到语言中可以保护我们免受向后不兼容

假设我们已经将新方法添加到接口List,那么我们可以简单地在需要的地方实现它(ArrayListLinkedList 等)事件而没有默认方法实现?

确切的不兼容性隐藏在哪里?没有默认方法可以破坏什么?

这里的问题是关于breaking source compatibility,但我的问题有点不同——关于保存它。

【问题讨论】:

  • 请阅读功能接口和流API。这将有助于你理解。
  • @iamrajshah,阅读后我的印象是 JDK 开发人员只是懒得将 List 接口的新方法的实现添加到每个 JDK List 实现中,并决定将其留在接口中。但是现在我知道了哪里可以在其他代码中破坏自定义 List 实现。

标签: java


【解决方案1】:

假设我们已经将新方法添加到接口 List 中,那么我们可以简单地在需要的位置(ArrayList、LinkedList 等)事件中实现它,而无需默认方法实现?

当您不控制List 的所有实现时,您如何做到这一点?你(指 Java 大神)可以将它添加到 JDK 中,但其他人代码中的所有实现如何?那些将不再编译。如果有人试图在他们的实现中调用其中一种新方法(从以前编译的 JAR 文件中),他们会在运行时得到一个讨厌的MethodNotFoundError

向后兼容性意味着现有代码无需修改即可工作。在这种情况下,它们的目标是源代码兼容性,这意味着您可以编译相同的源代码,而无需针对新的 Java 版本进行更改。另一件事是二进制兼容性,这意味着旧的编译类继续工作(Java 以这一点闻名)。

源代码兼容性不时被破坏(例如,JDBC API 因总是获取新的接口方法而臭名昭著),但在 List 这样的中心类中没有(JDBC 更改仅影响数据库驱动程序)供应商,而不是应用程序代码)。

因此,如果没有默认方法,则无法将新方法添加到 List 接口。它需要额外的 EnhancedListListV8(所有 JDK 列表都已实现,但所有使用代码都需要重构才能使用)。

【讨论】:

  • 你(指Java之神)可以将它添加到JDK中,但是其他人代码中的所有实现如何?他们不会再编译了。 所以,在编译你 only 意味着 custom List implementations?
  • 如果向接口添加新方法,现有的实现将不再编译。所有这些都需要针对新方法进行修改。这包括您控制的源代码以及(如果您已将您的界面作为库的一部分提供)其他人的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2015-03-17
  • 2019-11-14
相关资源
最近更新 更多