在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类,但它不保留对封闭类的引用。

09-30 15:10
查看更多