双括号初始化和“某种”静态匿名类
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");
// ...
;
sSet1
和 sSet2
都使用匿名嵌套类进行初始化,这些嵌套类不保留对 Outer
类的引用。
是否意味着这些匿名类本质上是static nested
类?
【问题讨论】:
您的第一个示例没有引用Outer
还是我遗漏了什么?
@SotiriosDelimanolis 好吧,我相信第一个示例中的匿名内部类确实包含对 Outer.this
的隐式引用
不,它没有。您在两者中都处于static
上下文中。没有外部实例。
@SotiriosDelimanolis 对,愚蠢的我,对不起。
大声笑,这有点苛刻。通常,我会在我的 IDE Outer.this.someMethod()
中尝试这个。如果它不编译,那么就得重新考虑我的逻辑。
【参考方案1】:
正如在您所讨论的相关问题中讨论的那样,匿名类在技术上不能是静态的,但如果它是在静态上下文中声明的,它可以被称为实际上是静态的,就是这样没有引用外部实例。
但是,在您的情况下,两种方法之间肯定没有区别,静态字段的初始化也是静态上下文。
【讨论】:
+1 是的,你说得对,没有区别,我完全忽略了这一点。您能否给出有效静态和普通静态嵌套类之间的一些实际区别。汤姆在他的回答中引用了JLS 3rd Ed
(我指的是这个),但也许你可以为我做个简短的总结吗?谢谢。
在阅读了this问题的所有答案后,我意识到没有技术上的区别,否则不建议这样做,因为这个Java特性可能会被取消。以上是关于双括号初始化和“某种”静态匿名类的主要内容,如果未能解决你的问题,请参考以下文章