重构方法时,很容易在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(); }
}
我想到了关于扩展方法的同样的事情...这是行不通的,因为参数的类名成为内部方法名的一部分。我想知道是否同样适用于编译器认为声明该方法的类的名称。 – Thilo 2009-09-02 01:47:56
“加宽”会影响该方法的签名,但将该方法移至超类不会。在命令行上试用它。 – 2009-09-02 03:00:06
@bkail:让这个答案,以便我可以投票。 – Thilo 2009-09-02 04:49:39