クラスでフィールド注入を使用すると、次のようになります。
@Inject
private MyClass myField;
このフィールドの「安全な公開」ステータスについて何か推測できますか? 別の言い方をすれば、MyClass 自体がスレッドセーフであると仮定すると、このフィールドを使用する際に注意すべき同時実行のリスクはありますか?
私の本能は通常、可能であればすべてのフィールドを最終的に作成することですが、フィールド注入では機能しません。もちろん、コンストラクター インジェクションを使用することもできますが、通常は、プロキシ処理のためだけに追加の「偽の」引数なしコンストラクターを作成する必要があります。大した問題ではありませんが、フィールド注入を使用する方が便利です。別のオプションとして、フィールドを揮発性としてマークすることもできます (または、ロックを使用することもできます...) が、それは本当に必要ですか?
JSR-299 仕様は、この質問に答えていないようです。Weld などの実装で CDI を使用しています。
- 注入先のオブジェクトは、複数のスレッドで使用されます (たとえば、@ApplicationScoped です) 。これ欲しい。
- MyClass が不変の場合、安全な公開は問題にならないことを理解しています。しかし、必ずしも不変オブジェクトだけを注入するとは限りません。
- MyClass 自体はスレッドセーフであると想定されています。これは私の関心事ではありません。Java メモリ モデルの規則により、スレッドが MyClass の半分構築されたインスタンスを参照する可能性など、厳密には安全でないパブリケーションに関する懸念があります。