好的,所以我现在已经进行了一些Java编程,偶尔我发现我需要创建一个对象的新实例,但我不需要该变量作为参考,例如使用GUI。当我使用GUI时,我会做这样的事情:
public class MainWindow extends JFrame {
/**
* Creates new form MainWindow
*/
public MainWindow() {
initComponents();
}
private void initComponents() {
/*
* Setup main properties of window
*/
JComponent contentPane = (JComponent)getContentPane();
contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setJMenuBar(new MenuBar());
setTitle("Window Title");
setMaximumSize(new Dimension(1280, 720));
setMinimumSize(new Dimension(1280, 720));
setPreferredSize(new Dimension(1280, 720));
setSize(1280, 720);
setLocationRelativeTo(null);
setResizable(false);
//Add other stuff here
setVisible(true);
}
}
这样,每当我需要实例化GUI时,我只需要调用:
new MainWindow();
然而,我注意到Netbeans给了我一个关于此的提示,所以我知道这样做是不正确的做法。
话虽如此,当您不需要变量时,处理对象实例化的正确方法是什么?
答案 0 :(得分:3)
您的对象未被任何其他对象引用,并且可能被垃圾收集。如果在应用程序中只需要一个实例,则可以在同一个类中使用静态方法来实现单例,如下所示(下面的代码尚未编译):
public class MainWindow extends JFrame {
private static MainWindow instance;
public static MainWindow getMainWindow() {
if (instance == null) {
instance = new MainWindow();
}
return instance;
}
/**
* Creates new form MainWindow
*/
private MainWindow() {
initComponents();
}
private void initComponents() {
// ... skip original code for brevity ...
}
}
请注意,在这种情况下,您可以将构造函数设为私有。
编辑根据评论将实例更正为空比较。
答案 1 :(得分:2)
我不认为这是不好的做法;我同意Sotirios Delimanolis的说法:“如果你将它分配给一个你不使用的变量,这是更糟糕的做法。”
但我确实认为你可以做一些事情来使它更清晰,更容易维护。
new ...
。这使得在代码中清楚了解调用构造函数的意图。如果需要,它还可以在以后更改方式。 示例:
private void instantiateTheGui() {
new MainWindow();
}
setVisible(true);
)至少应该被调用构造函数的代码调用,因为它可能不希望它立即可见。现在你的代码突然变成了:
private void instantiateAndShowTheGui() {
MainWindow window = new MainWindow();
window.setVisible(true);
}
现在我们有一个变量,以及它的合法用法。我并没有试图得到一个变量,它发生在良好的设计和责任分离上。
我的观点是,调用对象构造函数而不将其存储在变量中没有任何内在错误,但我从未遇到(IMO)使用此模式的设计良好的代码。这不错,但 clean 代码通常不会遇到问题。
答案 2 :(得分:1)
创建这样的类是不好的做法,因为:
如果其他开发人员读取此代码(或您的未来 - 您),您可能不记得为什么会有这样的未使用过的对象。
我会重写像是一个像
这样的东西new MainWindow().show();
show()
会致电initComponent()
。