のリファクタリングをサポートするための注釈は、以下の例を検討:2つの実装を有するGreeter
機能インターフェース
public interface Greeter {
String greet();
}
public class ExplicitGreeterImpl implements Greeter {
@Override
public String greet() {
return "Hello World!";
}
}
public class ImplicitGreeterImpl {
public String doTheGreeting() {
return "Hello World!";
}
}
private void run() {
System.out.println(new ExplicitGreeterImpl().greet());
Greeter foo = new ImplicitGreeterImpl()::doTheGreeting;
System.out.println(foo.greet());
}
機能インタフェースを。 ExplicitGreeterImpl
はimplements
節を使用してGreeter
を実装し、ImplicitGreeterImpl::doTheGreeting
はGreeter
を実装していません。それにもかかわらず、ImplicitGreeterImpl::doTheGreeting
は、のようにGreeter
を実装するように設計されています。
さて、私はGreeter
インターフェイスをリファクタリングしたいので、私はそれに名前を渡すことができます:
public interface Greeter {
String greet(String name);
}
私は、Eclipseが提供する変更メソッドシグネチャリファクタリングでこれを行うことができます(私は他の確信していますIDEにも同様のリファクタリングがあります)。これにより、Greeter
インターフェイスのすべての実装と用途が自動的に更新されます。実装は新しいパラメータを受け取りますが、用途は設定可能なデフォルト値を渡します。これはExplicitGreeterImpl
では問題なく動作しますが、リファクタリングではImplicitGreeterImpl::doTheGreeting
メソッドには触れません。したがって、割り当ては、
Greeter foo = new ImplicitGreeterImpl()::doTheGreeting;
となり、コンパイル時エラーになります。これを修正するには、メソッドImplicitGreeterImpl::doTheGreeting
の署名を手動で調整する必要があります。
多くの場合、ImplicitGreeterImpl::doTheGreeting
の署名を自動的に調整することは好ましくありません。しかし、私は、現在のワークフローを向上させることができることを感じる:
- Eclipseはコンパイル時にエラーがあることを示唆してリファクタリングのプレビューで警告を表示しません。
- メソッドにアノテーションを付けて、特定の機能インタフェースを実装することを明確にする必要があります。たとえば、
、ImplicitGreeterImpl
は次のようになります。
public class ImplicitGreeterImpl {
@Implements(Greeter.class)
public String doTheGreeting() {
return "Hello World!";
}
}
は今、リファクタリングツールはImplicitGreeterImpl::doTheGreeting
がGreeter
を実装するために、したがって、彼らは自動的にその署名を変更することができます想定されていることを確認して可能性があります。
したがって、私の質問です:リファクタリングツールに特定のメソッドが特定の機能インターフェイスを実装するはずであることを伝える方法はありますか?上記で提案した注釈を検索しましたが、役に立たないものは見つかりませんでした。
良いが、実際にありますインターフェイスを直接実装するのではなく、メソッド参照を使用する理由です。コマンドパターンを考えてみましょう。この場合、(1)コマンドインタフェースはおそらく機能インタフェースであり、(2)コマンドインタフェースの実装が多く、(3)これらの実装の各々は非常に単純である。これらの実装のそれぞれに余分なクラスを追加すると、コードに多くのノイズが追加されます。しかし、各コマンドの実装が単なるメソッドである場合、コードはもっときれいになります。 –