0

のリファクタリングをサポートするための注釈は、以下の例を検討: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()); 
} 

機能インタフェースを。 ExplicitGreeterImplimplements節を使用してGreeterを実装し、ImplicitGreeterImpl::doTheGreetingGreeterを実装していません。それにもかかわらず、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::doTheGreetingGreeterを実装するために、したがって、彼らは自動的にその署名を変更することができます想定されていることを確認して可能性があります。

したがって、私の質問です:リファクタリングツールに特定のメソッドが特定の機能インターフェイスを実装するはずであることを伝える方法はありますか?上記で提案した注釈を検索しましたが、役に立たないものは見つかりませんでした。

答えて

0

私は答えを探し続けましたが、注釈を使用する解決策はないようです。しかし、私は特定のユースケースを念頭に置いて質問しました。私は同じ機能インタフェースのさまざまな実装を1つのファイルに書き留めたいと思います。確かに、また自動リファクタリングツールとの素晴らしい作品この問題の解決策は、あります:

public interface Greeter { 
    String greet(); 
} 

public enum EnumGreeterImpl implements Greeter { 
    GREETER1 { 
     @Override 
     public String greet() { 
      return "Hello World!"; 
     } 
    }, 
    GREETER2 { 
     @Override 
     public String greet() { 
      return "Foo bar"; 
     } 
    }, 
} 

private void run() { 
    Greeter foo = EnumGreeterImpl.GREETER1; 
    System.out.println(foo.greet()); 
} 

も参照してください:

0

はい:インターフェイスを実装する必要があります。 注釈をインターフェイスにリンクして追加することができれば、そのクラスにインターフェイスを実装させてみませんか?

+0

良いが、実際にありますインターフェイスを直接実装するのではなく、メソッド参照を使用する理由です。コマンドパターンを考えてみましょう。この場合、(1)コマンドインタフェースはおそらく機能インタフェースであり、(2)コマンドインタフェースの実装が多く、(3)これらの実装の各々は非常に単純である。これらの実装のそれぞれに余分なクラスを追加すると、コードに多くのノイズが追加されます。しかし、各コマンドの実装が単なるメソッドである場合、コードはもっときれいになります。 –

関連する問題