【问题标题】:Java anonymous inner classJava匿名内部类
【发布时间】:2014-10-23 08:05:28
【问题描述】:

匿名内部类的实例是存储所有可访问的最终变量还是仅存储在所述内部类中使用的变量? (即它是否执行某种分析?据我所知,无论如何都会存储对父实例的引用。)

【问题讨论】:

  • 我相信这个帖子会有所帮助:*.com/questions/4732544/…
  • 重新打开,因为链接的线程没有回答有多少这些最终变量被复制的问题。

标签: java closures inner-classes anonymous-class


【解决方案1】:

无论如何都会存储对封闭类的引用。

最终变量存储为副本,但前提是您在内部类的某个位置实际引用它们。这实际上并不需要任何额外的“分析”,但可以在正常的编译步骤中完成(编译器无论如何都必须解析变量,因此它也可以输出代码来设置副本)。

【讨论】:

  • 好的,我只是陈述这一点,没有任何参考。也许有人可以为一个最小的编译类填写一个字节码转储来演示。
  • 这是一个这样的转储,但它没有回答关于不需要的变量的部分:*.com/a/2804940/14955
  • 存储所有本地变量的编译器很可能仍然符合规范。换句话说,所讨论的行为原则上是依赖于实现的。在实践中,你是 100% 正确的,因为没有一个理智的编译器会不遗余力地存储不必要的数据。
  • 希望如此。尤其是因为将每个变量和参数设为 final 是一种常见的良好做法,除非必须对其进行修改,这会在这里增加令人讨厌的隐藏开销。
  • 另外请注意,在 Java 8 中,捕获的变量根本不需要是 final 的。所以本地类可能会捕获所有有效的最终变量。