リファクタリングの際に、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(); }
}
私は広げられたメソッドについて同じことを考えました...引数のクラス名が内部メソッド名の一部になるため、これは機能しません。コンパイラがそのメソッドを宣言したと考えるクラスの名前と同じものが当てはまるのだろうかと思います。 – Thilo
「拡大」はメソッドのシグネチャに影響しますが、メソッドをスーパークラスに移動することはできません。コマンドラインで試してみてください。 –
@bkail:答えを出して投票できるようにしてください。 – Thilo