10

メソッドをリファクタリングする場合、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(); }
 }
4

2 に答える 2

14

「Widening」はメソッドのシグニチャに影響を与えるため、バイナリ互換ではありません。メソッドをスーパークラスに移動しても、メソッドのシグネチャには影響しないため、機能します。Eclipseには、APIとABIの互換性を説明する優れたドキュメントがあります。

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

より明確なルールはパート2にあります。

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

「仮パラメーターの型の変更」(つまり、拡張と呼ぶもの)または「APIメソッドを型階層の上位に移動する」(つまり、親クラスへのプルと呼ぶもの)に興味があると思います。

于 2009-09-03T05:15:56.803 に答える
-2

Javaには動的リンクがあるため、引き続き自動的に機能するはずです

于 2009-09-02T01:10:59.150 に答える