2009-09-02 71 views
8

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

回答

12

自動工作「擴大」影響了方法的簽名,這樣是不是二進制兼容的。將方法移到超類不會影響方法簽名,因此它可以工作。 Eclipse有描述API和ABI的兼容性有很大的文檔:

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

更明確的規則是在第2部分:

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

我相信你感興趣的「更改類型的形式參數「(即,你所說的擴展)或」將API方法向上移動到類型層次結構「(即你所說的拉入父類)。

-1

應該繼續爲Java提供了動態鏈接

+0

我想到了關於擴展方法的同樣的事情...這是行不通的,因爲參數的類名成爲內部方法名的一部分。我想知道是否同樣適用於編譯器認爲聲明該方法的類的名稱。 – Thilo 2009-09-02 01:47:56

+1

「加寬」會影響該方法的簽名,但將該方法移至超類不會。在命令行上試用它。 – 2009-09-02 03:00:06

+0

@bkail:讓這個答案,以便我可以投票。 – Thilo 2009-09-02 04:49:39