我正在阅读Joshua Bloch的Effective Java。
在项目17:“仅使用接口(interface)定义类型”中,我遇到了不建议使用接口(interface)存储常量的解释。我在下面说明。
“更糟糕的是,它代表着一种 promise :如果在将来的版本中,该类将被修改,以使其
不再需要使用常量,它仍然必须实现接口(interface)以确保二进制
兼容性。”
二进制兼容性在这里意味着什么?
有人可以用Java的例子指导我,说明代码是二进制兼容的。
最佳答案
简而言之,二进制兼容性意味着更改类时,无需重新编译使用它的类。例如,您从此类中删除或重命名了公共(public)或 protected 方法
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)方法时,它将中断其应用程序。
并且,如果删除常数接口(interface)(第17项),由于相同的原因,这也会破坏二进制兼容性。
但是您可以在不破坏二进制兼容性的情况下删除/重命名此类的私有(private)或程序包私有(private)成员,因为外部应用程序不能(或不应)使用它。