9.2.3.3. 修飾子を使用して不明な挿入を解決

概要

このタスクは、不明な挿入を示し、修飾子を使用して不明な挿入を削除します。不明な挿入の詳細については、「依存性があいまいな場合、あるいは満たされていない場合」 を参照してください。

例9.5 不明な挿入

Welcome の 2 つの実装があり、1 つは翻訳を行い、もう 1 つは翻訳を行いません。このような場合は、以下の挿入が不明であり、翻訳を行う Welcome を使用するよう指定する必要があります。
public class Greeter {
  private Welcome welcome;

  @Inject
  void init(Welcome welcome) {
    this.welcome = welcome;
  }
  ...
}

手順9.3 修飾子を使用して不明な挿入を解決する

  1. @Translating という修飾子アノテーションを作成します。

    @Qualifier
    @Retention(RUNTIME)
    @Target({TYPE,METHOD,FIELD,PARAMETERS})
    public @interface Translating{}
    
  2. 翻訳を行う Welcome@Translating アノテーションでアノテートします。

    @Translating
    public class TranslatingWelcome extends Welcome {
        @Inject Translator translator;
        public String buildPhrase(String city) {
            return translator.translate("Welcome to " + city + "!");
        }
        ...
    }
    
  3. 挿入の、翻訳を行う Welcome を要求します。

    ファクトリーメソッドパターンの場合と同様に、修飾された実装を明示的に要求する必要があります。不明な点は、挿入時に解決されます。
    public class Greeter {
      private Welcome welcome;
      @Inject
      void init(@Translating Welcome welcome) {
        this.welcome = welcome;
      } 
      public void welcomeVisitors() {
        System.out.println(welcome.buildPhrase("San Francisco"));
      }
    }
    
結果

TranslatingWelcome が使用されます。不明な点はありません。