在Java中,嵌套类可以是static
,也可以不是。如果它们是static
,则它们不包含对包含实例的指针的引用(它们也不再称为内部类,它们被称为嵌套类)。
如果在不需要引用时忘记创建嵌套类static
,可能会导致垃圾回收或转义分析问题。
是否可以将匿名内部类设为static
?还是编译器会自动找出原因(之所以会这样,因为不能有任何子类)?
例如,如果我做一个匿名比较器,几乎不需要外部引用:
Collections.sort(list, new Comparator<String>(){
int compare(String a, String b){
return a.toUpperCase().compareTo(b.toUpperCase());
}
}
最佳答案
不,您不能,不,编译器无法弄清楚。这就是为什么FindBugs总是建议如果匿名内部类不使用其隐式static
引用,则将其更改为命名this
嵌套类。
编辑: Tom Hawtin-大头贴说,如果匿名类是在静态上下文中创建的(例如,在main
方法中),则匿名类实际上是static
。但是JLS disagrees:
Roedy Green的Java Glossary says that在静态上下文中允许匿名类的事实取决于实现:
编辑2: JLS实际上在§15.9.2中更明确地涵盖了静态上下文:
因此,静态上下文中的匿名类大致等效于static
嵌套类,因为它在技术上不是static
类,但它不保留对封闭类的引用。