使用Java将内部类设置为静态有什么好处?

pro*_*eek 24 java findbugs class

我的Java类中有一个内部类.

在此输入图像描述

当我运行查找错误时,它建议(警告)使其成为静态.

在此输入图像描述

这个警告有什么意义?将内部类设为静态有什么好处?

Jef*_*rey 25

如果嵌套类不访问封闭类的任何变量,则可以将其设置为静态.这样做的好处是您不需要外部类的封闭实例来使用嵌套类.


Joe*_*ckx 10

默认情况下,内部类具有对外部类的对象的隐式引用.如果你从外部类的代码中实例化了这个对象,那么这一切都是为你完成的.否则,您需要自己提供对象.

静态内部类没有这个.

这意味着它可以在外部类对象的范围之外实例化.它还意味着如果您"导出"内部类的实例,它将不会阻止收集当前对象.

作为一个基本规则,如果内部类没有理由访问外部类,则默认情况下应将其设置为静态.


Tim*_*imK 7

静态内部类在语义上更简单。它就像一个顶级类,除了您有更多的可见性选项(例如,您可以将其设为私有)。

避免使用非静态内部类的一个重要原因是它们更复杂。存在对外部类的隐藏引用(甚至可能不止一个)。内部类的方法中的简单名称现在可能是以下三种情况之一:本地、字段或外部类的字段。

这种复杂性的一个工件是对外部类的隐藏引用可能导致内存泄漏。假设内部类是一个侦听器,并且可以是一个静态内部类。只要侦听器被注册,它就会持有对外部类实例的引用,这反过来可能会占用大量内存。使侦听器静态可能允许对外部实例进行垃圾收集。


kan*_*kan 5

非静态内部类具有对外部类的隐式引用。如果将类设为静态,则可以节省一些内存和代码。