2017-11-18 10 views
0

多くの場合、@Injectフィールドの巨大なリストがクラスの先頭にあります。これは@Injectアノテーションの冗長な繰り返しです。いくつかのカスタム注釈魔法を使う複数のフィールドを@Injectとしてマークする@InjectAllアノテーション

、それがコード内でこの単純化を可能にするために、新しい@InjectAll注釈を書き込むことができる:

前に、個別に各フィールドに注釈を付ける:

@Inject 
private Logger logger; 

@Inject 
private Event<String> simpleMessageEvent; 

後、すべての注入さをグループ化します1つのグループ内のフィールド:

@InjectAll { 
    private Logger logger; 
    private Event<String> simpleMessageEvent; 
} 

またはよりコンパクトなコードを書くための任意の同等の構文?

+0

Hehe、あなたも私のコードであなたのようなリストを見つけました。そして、私にとっては、Beanが単一の責任原則を破っていると感じています*リファクタリング/再考が必要です。あなたが聞いていることは*できます*(CDI拡張 - 提案された構文ではありません)。しかし、私はそれをするべきではないと信じています。 –

答えて

0

あなたの提案は2つのJava構文エラーが含まれています

  • あなたはブロック内のグループフィールドの宣言をすることはできません。
  • ブロックに注釈を付けることはできません。

あなたは

@InjectAll({"logger", "simpleMessageEvent"}) 
public class MyClass { 
    private Logger logger; 
    private Event<String> simpleMessageEvent;  
} 

のようなものをサポートするために、CDIエクステンションを作成することができるかもしれませんが、これは本当にそれほど冗長フィールド上で直接@Inject注釈を持つよりはありません。

+0

確かに、私のコードは「純粋なJava」ではなく、Javaとアノテーションの構文を改善するための単なる提案でした。 Javaはまだ設定されておらず、将来的に特別なニーズに対応するために言語構文を拡張/カスタマイズすることが可能になります。とにかく入力していただきありがとうございます...しかし、フィールドを参照するために文字列を使用すると、フィールドの名前を変更すると壊れます。 – PierluigiVernetto

0

CDIでは、これを実現するための組み込み方法はありません。 前述したように、想像力と組み合わされたCDI拡張機能を使って、必要なだけのカスタム構文を作成することができます。しかし、これにより作業が大幅に単純化されず、複雑さが増し、コードの可読性が低下する可能性があります。

あなたのコードをもう一度見て、各クラスにたくさんの注入が本当に必要かどうか、クラスごとの責任を均等に分割するためにそのクラスをいくつか他のものにリファクタリングする必要があるかどうかを確認することをお勧めします。あなたが記述していることは、多くの場合、すべてのことを扱う「宇宙入門クラス」のケースです。もちろん、これはベストプラクティスではありません。

関連する問題