メソッド内で匿名の内部クラスを使用する場合、匿名の内部クラス内でメソッド パラメーターを使用する場合は、それを final としてマークする必要があります。ここにいくつかの詳細があります: 匿名の内部クラスで final キーワードを使用するのはなぜですか?
しかし、メソッドのローカル属性ではなくクラス属性を使用するとどうなるでしょうか?
シンプルなユースケース: Guava 関数を使用した Spring サービス:
protected LovValueDAO lovValueDAO;
private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() {
@Override
public LovValue apply(String input) {
return lovValueDAO.findById(input);
}
};
@Required
public void setLovValueDAO(LovValueDAO lovValueDAO) {
this.lovValueDAO = lovValueDAO;
}
そのような Guava 関数を宣言するのは安全ですか? 私のテストによると、それは正常に動作しますが、ボンネットの後ろで何が起こるのでしょうか?
初期化の順序は次のとおりです。
- 関数が初期化されます
- lovValueDAO は、セッターを介してスプリングによって注入されます
したがって、関数が最初に初期化されるため、関数内で使用される lovValueDAO 属性は参照のコピーではなく、DAO が実際に注入されると正常に動作するため、参照自体になると思います。
私は正しいですか?
そして、このコードを使用するとどうなりますか:
private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() {
@Override
public LovValue apply(String input) {
return lovValueDAO = null;
}
};
protected LovValueDAO lovValueDAO;
関数を呼び出した後、outside 属性は null に設定されますか?