java - 为什么向 Java 接口(interface)添加新方法会破坏依赖旧版本的客户端?

标签 java design-patterns interface jvm-languages

在 Java 中,当您向接口(interface)添加新方法时,您会破坏所有客户端。当您有一个抽象类时,您可以添加一个新方法并在其中提供默认实现。所有客户将继续工作。

我想知道为什么界面要这样设计?

所有旧方法仍然存在,因此似乎不存在向后兼容性问题。 (当然需要有某些异常(exception),但我认为能够在不破坏客户端的情况下向 java 接口(interface)添加新方法可能是一个非常好的主意......)

非常感谢您的评论。

最佳答案

我可以看到一些可能的中断

  • 您假设客户端将使用新的重载方法,但他们不会这样做,因为代码尚未重新编译。
  • 您添加了客户端已有的方法,该方法执行不同的操作。
  • 您添加了一个方法,这意味着它们的子类在重新编译时会中断。恕我直言,这是可取的。
  • 您更改返回类型、方法名称或参数类型,这将导致运行时错误。
  • 交换相同类型的参数。这可能是最糟糕、最微妙的错误。 ;)

恕我直言,正是这些微妙的问题才更有可能引起你的悲伤。但是,我不会认为简单地添加一个方法就会破坏代码,并且我不会认为如果客户端的代码没有出现运行时错误就意味着他们正在使用任何最新版本。 ;)


如果我编译这段代码

public interface MyInterface {
    void method1();

    // void method2();
}

public class Main implements MyInterface {
    @Override
    public void method1() {
        System.out.println("method1 called");
    }

    public static void main(String... args) {
        new Main().method1();
    }
}

打印

method1 called

然后,我取消注释 method2() 并仅重新编译接口(interface)。这意味着该接口(interface)具有 Main 未实现的方法。然而,当我在不重新编译 Main 的情况下运行它时,我得到了

method1 called

如果我有

public class Main implements MyInterface {    
    public void method1() {
        System.out.println("method1 called");
    }

    public void method2() {
        System.out.println("method2 called");
    }

    public static void main(String... args) {
        new Main().method1();
    }
}

并且我用注释掉的 //method2() 运行,我没有问题。

关于java - 为什么向 Java 接口(interface)添加新方法会破坏依赖旧版本的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561413/

相关文章:

java - 为什么此后台任务会因致命异常而失败?

java - 平台模块之间是否允许循环?

python - 是否有从协程端点返回值的标准方法

design-patterns - GWT 2.1 中包含的 MVP 框架是否使其他 GWT MVP 框架变得多余?

java - 需要建议 : static methods in JAVA interface

java - 在 MacOSX 上抓取 openFileEvent(无法获取文件名)

java - 将用户凭据从 session 传递到小程序?

java - 使空对象不可变的任何标准模式或策略

C# 内部接口(interface)与内部实现

c++ - 如何在不更改代码的情况下替换接口(interface)的实现?