2

Javaでリファクタリングを行う必要があり、ある程度のバイナリ互換性を維持する必要があります。この場合、もうどこにも使用されておらず、かなり大きな(そして非推奨の)外部依存関係を必要とするいくつかのレガシーインターフェースを削除したいと思います。

Cインターフェイスを実装するクラスがIあり、のインスタンスでメソッド(インターフェイスで宣言されている)を呼び出すコードがありますC。呼び出し元のコードはC、インターフェイスだけでなく、を使用していることを認識しています。

 class C implements I {
      void theMethod(){} ; // is declared in the interface I
 }

 C object;
 object.theMethod();

クラス定義からインターフェイスを削除しても(ただし、すべてのメソッドは保持します)、呼び出し元のコード(インターフェイスをまったく参照していません)は引き続き機能しますか(再コンパイルなし)?

4

3 に答える 3

5

Iはい、動作します-どこでもインターフェースを明示的に参照しない限り。

JLSから:シンボリック参照の解決:

クラスまたはインターフェースのバイナリ表現は、他のクラスおよびインターフェースのバイナリ名(§13.1)を使用して、他のクラスおよびインターフェースとそれらのフィールド、メソッド、およびコンストラクターをシンボリックに参照します。

クラスClientClassのフィールド/メソッドを参照するクラスには、クラスが実装する可能性のあるCインターフェイスへの暗黙の参照は含まれていません。I

于 2009-12-11T07:54:27.030 に答える
2

Cクラスのオブジェクトが決して参照されない限り、これは機能しますI

進化するJavaベースのAPIパート2も参照できます。

于 2009-12-11T08:00:47.003 に答える
1

インターフェイスをどこかにインポートすると、呼び出し元のコードに問題が発生する可能性があります。呼び出し元のコードのいずれにもインターフェイスがない場合はimport、リファクタリングが計画どおりに機能することを合理的に確信できます。

于 2009-12-11T08:00:14.710 に答える