为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以使Java中的匿名内部类静态化?

是否可以使Java中的匿名内部类静态化?

繁花如伊 2019-12-17 11:16:53
在Java中,嵌套类可以是static或不是。如果它们是static,则它们不包含对包含实例的指针的引用(它们也不再称为内部类,它们称为嵌套类)。static在不需要引用时忘记创建嵌套类可能会导致垃圾回收或转义分析的问题。是否可以建立匿名内部类static?还是编译器会自动找出原因(之所以会这样,因为不能有任何子类)?例如,如果我做一个匿名比较器,几乎不需要外部引用:  Collections.sort(list, new Comparator<String>(){       int compare(String a, String b){          return a.toUpperCase().compareTo(b.toUpperCase());       }  }
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

不,您不能,也不,编译器无法弄清楚。这就是为什么FindBugs总是建议static如果匿名内部类不使用隐式this引用,则将其更改为命名嵌套类。


编辑: Tom Hawtin-tackline说,如果匿名类是在静态上下文中创建的(例如在main方法中),则实际上是匿名类static。但是联合检查组不同意:


永远不会有匿名类abstract(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);从来没有static(§8.1.1,§8.5.1)。匿名类始终是隐式的final(第8.1.1.2节)。


Roedy Green的Java词汇表说,在静态上下文中允许匿名类的事实取决于实现:


如果您想让那些维护您代码的人感到困惑,那么笨拙的发现javac.exe会允许staticinit代码和static方法中包含匿名类,即使语言规范说从来没有匿名类static。当然,这些匿名类无法访问该对象的实例字段。我不建议这样做。该功能可以随时拉出。


编辑2: JLS实际上在§15.9.2中更明确地涵盖了静态上下文:


令C为实例化的类,令我为正在创建的实例。如果C是一个内部类,那么我可能有一个立即封闭的实例。i的紧邻实例(第8.1.3节)的确定如下。


如果C是一个匿名类,则:

如果类实例创建表达式在静态上下文中出现(第8.1.3节),则我没有立即封闭的实例。

否则,i的直接封闭实例为this。

因此,静态上下文中的匿名类与static嵌套类大致等效,因为它在技术上不是类,但它不保留对封闭类的引用static。


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 325 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信