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
实例BrushListDialog
的实例(我认为这是一个很难理解的问题)我个人不认为有必要将类重构为非静态的-我们这里不是在讨论巨大的开销,只是在实践中的一个引用。考虑到这一点,它归结为什么是更可读和可维护的选项;我认为让代码保持原样是最好的选择 也就是说,如果你真的想让它成为静态的,我会选择你在第一个选项的基础上给出的第二个选项
您添加的第三个选项听起来很糟糕—绝对不要使用它。就JVM而言,选项(1)和(2)通常是相同的—Java编译器隐式地创建对父类的引用和适当的构造函数 我将根据是否需要在父类之外使用该类来决定静态与嵌套。如果不是,则使用嵌套类来避免显式编写父引用代码,但要注意由不正确的访问说明符创建的隐式访问委托方法
选项(3)听起来像是一个非常脆弱的黑客,我会不惜一切代价避免它……您没有给出任何反对内部类的理由,那么您为什么要犹豫使用它呢?