重構方法時,很容易在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