首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Java中的二进制兼容性?

什么是Java中的二进制兼容性?
EN

Stack Overflow用户
提问于 2013-02-20 06:11:12
回答 2查看 15K关注 0票数 56

我在读约书亚·布洛赫的“有效Java”。

在第17项:“只使用接口来定义类型”中,我遇到了不建议使用接口来存储常量的解释。我把解释写在下面。

“更糟糕的是,它代表了一种承诺:如果在以后的发行版中对类进行了修改,使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。”

二进制兼容性在这里意味着什么?

有人能用Java中的一个例子来指导我说明代码是二进制兼容的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-20 06:23:38

简而言之,二进制兼容性意味着当您更改类时,不需要重新编译使用它的类。例如,您从这个类中删除或重命名了一个公共或受保护的方法。

代码语言:javascript
复制
public class Logger implements Constants {
   public Logger getLogger(String name) {
         return LogManager.getLogger(name);
   }
}

在您的log-1.jar库中发布了一个新版本,名为log-2.jar。当您的log-1.jar的用户下载新版本时,当他们尝试使用缺失的getLogger(String name)方法时,它会破坏他们的应用程序。

如果删除常量接口(第17项),由于同样的原因,这也会破坏二进制兼容性。

但是您可以删除/重命名这个类的私有或包私有成员,而不破坏二进制兼容性,因为外部应用程序不能(或者不应该)使用它。

票数 54
EN

Stack Overflow用户

发布于 2017-10-18 07:18:35

如果将来,我们希望更改某些类正在实现的接口(例如,添加一些新方法)。

如果我们添加抽象方法(附加方法),那么类(实现接口)必须实现--创建依赖约束的附加方法,以及执行这些约束的开销。

为了克服这一问题,我们可以在接口中添加默认方法。

这将消除实现附加方法的依赖关系。

我们不需要修改实现类来合并更改。这被称为二进制兼容性。

请参阅下面的例子:

我们将要使用的接口

代码语言:javascript
复制
    //Interface       
    interface SampleInterface
            {
                // abstract method
                public void abstractMethod(int side);

                // default method
                default void defaultMethod() {
                   System.out.println("Default Method Block");
                }

                // static method
                static void staticMethod() {
                    System.out.println("Static Method Block");
                }
            }


//The Class that implements the above interface.

    class SampleClass implements SampleInterface
    {
        /* implementation of abstractMethod abstract method, if not implemented 
        will throw compiler error. */
        public void abstractMethod(int side)
        {System.out.println(side*side);}

        public static void main(String args[])
        {
            SampleClass sc = new SampleClass();
            sc.abstractMethod(4);

            // default method executed
            sc.defaultMethod();

            // Static method executed
            SampleInterface.staticMethod();

        }
    }

备注:更详细的信息,请参阅默认方法

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14973380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档