3

テストのために、クラス内に匿名のネストされたクラスを作成するクイック「ダブルブレース」初期化を使用することがありますOuter。次に例を示します。

static final Set<String> sSet1 = new HashSet<String>() {
    {
        add("string1");
        add("string2");
        // ...
    }
};

編集 私は、この例がOuterインスタンスへの参照を保持しているという以前の誤ったステートメントを修正しています。そうではなく、事実上、次のものと同等です。

static final Set<String> sSet2;
static {
    sSet2 = new HashSet<String>() {
        {
            add("string1");
            add("string2");
            // ...
        }
    };
}

との両方がsSet1、クラスsSet2への参照を保持しない匿名のネストされたクラスで初期化されますOuter

これらの匿名クラスは本質的にstatic nestedクラスであるということですか?

4

1 に答える 1

3

あなたが参照している関連する質問で説明されているように、匿名クラスは技術的に静的にすることはできませんが、静的コンテキストで宣言されている場合、つまり外部インスタンスへの参照がない場合、効果的に静的と呼ぶことができます。

ただし、あなたの場合、2 つのアプローチに違いはありません。静的フィールドの初期化も静的コンテキストです。

于 2013-12-15T18:38:19.223 に答える