gpt4 book ai didi

java - 为了保留引用而将嵌套类声明为非静态?

转载 作者:行者123 更新时间:2023-11-30 04:34:37 26 4
gpt4 key购买 nike

假设我有一个专门的子类 JDialog (称为 BrushListDialog ),其中我有一个 JList 。该列表使用自定义列表模型(扩展 DefaultListModel<String> )和自定义单元格渲染器(扩展 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.this当然,不能在静态上下文中调用,因此嵌套类不能是静态的。

我看到了三种处理此问题的方法(不能使用 null 作为 showConfirmDialog 中的第一个参数):

  1. 保持单元格渲染器静态,但将列表模型设置为内部类,以便能够调用 BrushListDialog.this .
  2. 将两个嵌套类设为静态,并传递当前的 BrushListDialog通过列表模型的构造函数实例化。
  3. 使用 Swing 实用程序方法遍历组件并找到 BrushListDialog 的实例(我认为这很hacky)。

所以我问你:为了能够访问父对话框的实例而保持列表模型非静态值得吗?

Source code for the two nested classes

最佳答案

我个人认为不需要将类重构为非静态的 - 我们在这里讨论的不是巨大的开销,只是实践中的单个引用。鉴于此,归根结底是哪个选项更具可读性和可维护性;我认为保留代码原样最适合该类别。

也就是说,如果您真的想使其静态,我会选择您在第一个选项中提供的第二个选项。

您添加的第三个听起来很糟糕 - 绝对远离那个。

关于java - 为了保留引用而将嵌套类声明为非静态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com