2

メソッド内で匿名の内部クラスを使用する場合、匿名の内部クラス内でメソッド パラメーターを使用する場合は、それを 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 に設定されますか?

4

1 に答える 1

4

this内部クラスは、それを囲むインスタンス(つまり、それが作成されたコンテキスト内の宣言クラスのインスタンス) への暗黙的な参照を保持するため、宣言クラスのフィールドへのアクセスは、その参照による通常のフィールド アクセスとして扱われます。

したがって、内部クラスはフィールドの現在の値を確認し、それを変更することもできます。

于 2012-08-09T12:03:13.123 に答える