10

在重构方法时,很容易在 Java 中引入二进制不兼容(与以前版本的代码)。

考虑更改方法以将其参数类型扩大到父接口:

 void doSomething(String x);

 // change it to

 void doSomething(CharSequence c);

使用此方法的所有代码将继续编译而无需更改,但确实需要重新编译(因为旧的二进制文件将因 MethodNotFoundError 而失败)。

将方法拉到父类中怎么样。这需要重新编译吗?

// before
public class B extends A{
    protected void x(){};
}

// after
public class A {
    public void x(){};
}
public class B extends A{}

该方法已从 B 移至父 A。它还将可见性从受保护更改为公开(但这不是问题)。

我需要在 B 中维护一个“二进制兼容性包装器”,还是它会继续工作(自动分派给父类)?

 // do I need this ?
 public class B extends A{
     // binary compatibility wrapper
     public void x(){ super.x(); }
 }
4

2 回答 2

14

“加宽”会影响方法的签名,因此不是二进制兼容的。将方法移动到超类不会影响方法签名,因此它会起作用。Eclipse 有一个很棒的文档来描述 API 和 ABI 的兼容性:

http://wiki.eclipse.org/Evolving_Java-based_APIs

更明确的规则在第 2 部分:

http://wiki.eclipse.org/Evolving_Java-based_APIs_2

我相信您对“更改形式参数的类型”(即您所说的扩展)或“将 API 方法向上移动类型层次结构”(即您所说的拉入父类)感兴趣。

于 2009-09-03T05:15:56.803 回答
-2

它应该继续自动工作,因为 Java 具有动态链接

于 2009-09-02T01:10:59.150 回答