重构方法时,很容易在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中。同时,可见性已从protected更改为public(但这不是一个问题)。
我是否需要在B类中维护一个“二进制兼容性包装器”,或者它会继续工作(自动分派到父类)?
// do I need this ?
public class B extends A{
// binary compatibility wrapper
public void x(){ super.x(); }
}