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

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

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

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

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

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

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

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