次の例を検討してください。
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());
}
機能インターフェースGreeter
には 2 つの実装があります。句を使用してExplicitGreeterImpl
実装しますが、それなしで実装します。それにもかかわらず、はと同様に を実装するように設計されています。Greeter
implements
ImplicitGreeterImpl::doTheGreeting
Greeter
ImplicitGreeterImpl::doTheGreeting
Greeter
ExplicitGreeterImpl
Greeter
ここで、インターフェイスをリファクタリングしたいので、名前を渡すことができます。
public interface Greeter {
String greet(String name);
}
これは、Eclipse が提供するChange Method Signatureリファクタリングを使用して行うことができます(他の 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
できるため、署名を自動的に変更できます。
したがって、私の質問は次のとおりです。特定のメソッドが特定の機能インターフェイスを実装することになっていることをリファクタリングツールに伝える方法はありますか? 上記で提案された注釈を検索しましたが、有用なものは見つかりませんでした。