0

次の例を検討してください。

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実装しますが、それなしで実装します。それにもかかわらず、はと同様に を実装するように設計されています。GreeterimplementsImplicitGreeterImpl::doTheGreetingGreeterImplicitGreeterImpl::doTheGreetingGreeterExplicitGreeterImpl

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できるため、署名を自動的に変更できます。

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

4

2 に答える 2

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());
}

以下も参照してください。

于 2016-11-06T18:24:19.777 に答える
0

はい: インターフェイスを実装する必要があります。インターフェイスにリンクするアノテーションを追加できる場合は、クラスにそれを実装してみませんか?

于 2016-09-25T20:23:41.183 に答える