【问题标题】:Do clients have to recompile after changing a Java interface?更改 Java 接口后客户端是否必须重新编译?
【发布时间】:2011-07-21 18:31:33
【问题描述】:

我在一个包含单个方法的 API 中有一个 Java 接口:

public interface MyInterface
{
    public void foo();
}

如果我像这样向该接口添加一个方法:

public interface MyInterface
{
    public void foo();
    public void bar();
}

使用 API 的客户端是否需要重新编译,或者他们可以按原样使用新的 JAR,因为我没有更改签名或现有方法或删除方法?

【问题讨论】:

  • 我认为运行时类验证器会打破这一点,因为声称实现该接口的现有类并不...

标签: java interface


【解决方案1】:

简答:无需重新编译即可使用新的 API。

这里有一个LINK,它可能会帮助您了解 Java 如何运行字节码以及它如何进行动态链接。

【讨论】:

  • 如果库的客户端有一个类实现了改变的接口呢?
  • @BoltClock: op 提到他/她是使用接口,而不是实现它。
  • @BoltClock2 如果客户端没有改变,那么他们永远不会调用未实现的方法。因此没问题。
  • @antlersoft:如果有一个类实现了改变的接口,当然需要重新编译。
  • 链接的材料真的很好;感谢您指出! (对于其他人,它引用了一篇学术论文,该论文基本上是相同的核心材料,但没有所有错别字,尽管它缺少 HTML 版本中的许多扩展示例。)
【解决方案2】:

视情况而定。

如果客户端要实现接口,客户端不仅需要重新编译,还必须首先在其实现类中实现新方法

如果客户端只使用接口(作为对在您系统一侧创建的对象的引用)客户端将不必重新编译。

【讨论】:

    【解决方案3】:

    如果您添加了一个方法,如果该方法从未使用过,则不需要重新编译实现者。你为什么要这样做?如果您正在实现第三方接口,例如添加了JDBC或JMS以及你既不实现也不调用的方法,你不需要重新编译。

    如果方法没有重载,调用者不需要重新编译。但是,如果方法被重载,调用者可能需要重新编译,因为它可能使用不同的方法调用。

    interface Methods {
        void method(double d);
        // adding a method
        void method(int i);
    }
    
    // calling code
    Method methods = ...
    methods.method(1);
    

    不重新编译,调用者会继续调用第一个方法,但是重新编译后,调用者会调用第二个方法。

    如果你删除了一个没有被调用的方法,这也很好。

    重命名方法与删除旧方法并添加新方法相同。

    如果更改参数类型或使用的方法的返回类型,则需要重新编译。

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 2021-03-30
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2017-09-08
      • 2023-03-13
      相关资源
      最近更新 更多