2009-09-02 7 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{} 

方法は、パブリック(しかし、それは問題ではない)への保護からの視認性をも変更された親AにBから移動してきました。

Bで「バイナリ互換ラッパー」を維持する必要がありますか、それとも動作し続けますか(自動的に親クラスにディスパッチ)しますか?

// do I need this ? 
public class B extends A{ 
    // binary compatibility wrapper 
    public void x(){ super.x(); } 
} 

答えて

12

を連結ダイナミックを有するように働くように、自動的に継続すべきです。メソッドをスーパークラスに移動してもメソッドのシグネチャには影響しないため、動作します。私はあなたがの変更タイプ」に興味を持っていると信じてい

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

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

より明示的なルールは、第2部では、次のとおりです。Eclipseは、APIとABIの互換性について説明偉大な書類を持っています(すなわち、あなたが拡大として参照するもの)または「APIメソッドをタイプ・タイプの階層に移動する」(つまり、親クラスに引っ張ることと呼ばれるもの)を指します。

-1

これは、Javaはそれがバイナリ互換ではないので、メソッドのシグネチャに影響を与える「広げる」

+0

私は広げられたメソッドについて同じことを考えました...引数のクラス名が内部メソッド名の一部になるため、これは機能しません。コンパイラがそのメソッドを宣言したと考えるクラスの名前と同じものが当てはまるのだろうかと思います。 – Thilo

+1

「拡大」はメソッドのシグネチャに影響しますが、メソッドをスーパークラスに移動することはできません。コマンドラインで試してみてください。 –

+0

@bkail:答えを出して投票できるようにしてください。 – Thilo

関連する問題