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");
            // ...
        }
    };
}

两者都使用匿名嵌套类初始化sSet1sSet2这些嵌套类不保留对Outer类的引用。

这是否意味着这些匿名类本质上是static nested类?

4

1 回答 1

3

正如在您所讨论的相关问题中所讨论的那样,匿名类在技术上不能是静态的,但如果它在静态上下文中声明,它可以被称为有效静态,即它没有对外部实例的引用。

但是,在您的情况下,两种方法之间肯定没有区别,静态字段的初始化也是静态上下文。

于 2013-12-15T18:38:19.223 回答