双括号初始化和“某种”静态匿名类

Posted

技术标签:

【中文标题】双括号初始化和“某种”静态匿名类【英文标题】:double brace initialization and "kind of" static anonymous class 【发布时间】:2013-12-15 18:16:47 【问题描述】:

有时为了测试,我会使用快速“双括号”初始化,它会在 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 类?

【问题讨论】:

您的第一个示例没有引用 Outer 还是我遗漏了什么? @SotiriosDelimanolis 好吧,我相信第一个示例中的匿名内部类确实包含对 Outer.this 的隐式引用 不,它没有。您在两者中都处于static 上下文中。没有外部实例。 @SotiriosDelimanolis 对,愚蠢的我,对不起。 大声笑,这有点苛刻。通常,我会在我的 IDE Outer.this.someMethod() 中尝试这个。如果它不编译,那么就得重新考虑我的逻辑。 【参考方案1】:

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

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

【讨论】:

+1 是的,你说得对,没有区别,我完全忽略了这一点。您能否给出有效静态和普通静态嵌套类之间的一些实际区别。汤姆在他的回答中引用了JLS 3rd Ed(我指的是这个),但也许你可以为我做个简短的总结吗?谢谢。 在阅读了this问题的所有答案后,我意识到没有技术上的区别,否则不建议这样做,因为这个Java特性可能会被取消。

以上是关于双括号初始化和“某种”静态匿名类的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象:构造函数初始化友元匿名对象内部类

C++类和对象:构造函数初始化友元匿名对象内部类

内部类和匿名内部类的用法

4.8static关键字,4.9嵌套类,4.10匿名累,4.11对象初始化器

java内部类之成员内部类之匿名内部类

(10)静态方法静态字段静态类匿名类