Java 为了保留引用,是否声明嵌套类为非静态类?

Java 为了保留引用,是否声明嵌套类为非静态类?,java,swing,static,inner-classes,Java,Swing,Static,Inner Classes,假设我有一个专门的子类JDialog(称为BrushListDialog),其中有一个JList。该列表使用自定义列表模型(扩展了DefaultListModel)和自定义单元格渲染器(扩展了DefaultListCellRenderer)。为了可读性,我将这些类嵌套在主类中 通常,我会将这些类设置为静态(这是我为单元渲染器所做的),但列表模型类有以下方法: private boolean showRemoveConfirmDialog(Object elem) { int option

假设我有一个专门的子类
JDialog
(称为
BrushListDialog
),其中有一个
JList
。该列表使用自定义列表模型(扩展了
DefaultListModel
)和自定义单元格渲染器(扩展了
DefaultListCellRenderer
)。为了可读性,我将这些类嵌套在主类中

通常,我会将这些类设置为静态(这是我为单元渲染器所做的),但列表模型类有以下方法:

private boolean showRemoveConfirmDialog(Object elem) {
    int option = JOptionPane.showConfirmDialog(BrushListDialog.this,
            elem + " is a default brush type.\nDo you want to allow the removal of such entries?",
            "Remove", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
    if (option == JOptionPane.YES_OPTION) {
        TYPES.clear();
        return true;
    }
    return false;
}
如您所见,它依赖于顶级类的实例来确定
JOptionPane
的显示位置
BrushListDialog。当然,不能在静态上下文中调用此
,因此嵌套类不能是静态的

我看到了三种处理方法(对于
showConfirmDialog
中的第一个参数使用
null
不是一个选项):

  • 保持单元格渲染器静态,但为了能够调用
    BrushListDialog,将列表模型设为一个内部类
  • 将两个嵌套类都设为静态,并通过列表模型的构造函数传递当前的
    BrushListDialog
    实例
  • 使用Swing实用程序方法浏览组件并找到
    BrushListDialog
    的实例(我认为这是一个很难理解的问题)
  • 所以我问你:为了能够访问父对话框的实例而保持列表模型非静态是否值得


    我个人不认为有必要将类重构为非静态的-我们这里不是在讨论巨大的开销,只是在实践中的一个引用。考虑到这一点,它归结为什么是更可读和可维护的选项;我认为让代码保持原样是最好的选择

    也就是说,如果你真的想让它成为静态的,我会选择你在第一个选项的基础上给出的第二个选项


    您添加的第三个选项听起来很糟糕—绝对不要使用它。

    就JVM而言,选项(1)和(2)通常是相同的—Java编译器隐式地创建对父类的引用和适当的构造函数

    我将根据是否需要在父类之外使用该类来决定静态与嵌套。如果不是,则使用嵌套类来避免显式编写父引用代码,但要注意由不正确的访问说明符创建的隐式访问委托方法


    选项(3)听起来像是一个非常脆弱的黑客,我会不惜一切代价避免它……

    您没有给出任何反对内部类的理由,那么您为什么要犹豫使用它呢?