我在读约书亚·布洛赫的“有效Java”。
在第17项:“只使用接口来定义类型”中,我遇到了不建议使用接口来存储常量的解释。我把解释写在下面。
“更糟糕的是,它代表了一种承诺:如果在以后的发行版中对类进行了修改,使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。”。
二进制兼容性在这里意味着什么?
有人能用Java中的一个例子来指导我说明代码是二进制兼容的吗?
发布于 2013-02-20 06:23:38
简而言之,二进制兼容性意味着当您更改类时,不需要重新编译使用它的类。例如,您从这个类中删除或重命名了一个公共或受保护的方法。
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项),由于同样的原因,这也会破坏二进制兼容性。
但是您可以删除/重命名这个类的私有或包私有成员,而不破坏二进制兼容性,因为外部应用程序不能(或者不应该)使用它。
发布于 2017-10-18 07:18:35
如果将来,我们希望更改某些类正在实现的接口(例如,添加一些新方法)。
如果我们添加抽象方法(附加方法),那么类(实现接口)必须实现--创建依赖约束的附加方法,以及执行这些约束的开销。
为了克服这一问题,我们可以在接口中添加默认方法。
这将消除实现附加方法的依赖关系。
我们不需要修改实现类来合并更改。这被称为二进制兼容性。
请参阅下面的例子:
我们将要使用的接口
//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();
}
}备注:更详细的信息,请参阅默认方法
https://stackoverflow.com/questions/14973380
复制相似问题