Java中重构的方法和二进制兼容性

时间:2009-09-02 01:01:26

标签: java refactoring binary-compatibility

在重构方法时,很容易在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(); }
 }

2 个答案:

答案 0 :(得分:13)

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

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

第2部分中有更明确的规则:

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

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

答案 1 :(得分:-1)

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

相关问题