构造函数调用的方法应该是静态的吗?

时间:2014-12-21 16:30:37

标签: java static

我正在为一个确认项目制作一个简单的圣经阅读器,我有一个UI类。该类在主类调用时打开一个窗口。我只是对静态关键字的多个错误感到满意,但还有一件事 - 我的prepareGUI方法。它应该被声明为静态吗?无论如何,我的IDE都不会出错。

package input;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class UI extends JFrame {

    private static final long serialVersionUID = 4226151097999382106L;

    private static JFrame mainFrame;
    private static JLabel headerLabel;
    private static JLabel statusLabel;
    private static JPanel controlPanel;

    public UI() {
        prepareGUI();
    }

    private static/* Should that be there? */ void prepareGUI() {
        mainFrame = new JFrame("Holy Bible");
        mainFrame.setSize(700, 500);
        mainFrame.setLayout(new GridLayout(3, 1));
        mainFrame.setLocationRelativeTo(null);
        mainFrame.getContentPane().setBackground(Color.WHITE);
        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });

        headerLabel = new JLabel("", JLabel.CENTER);
        statusLabel = new JLabel("", JLabel.CENTER);

        statusLabel.setSize(350, 100);

        controlPanel = new JPanel();
        controlPanel.setBackground(Color.WHITE);
        controlPanel.setLayout(new FlowLayout());

        mainFrame.add(headerLabel);
        mainFrame.add(controlPanel);
        mainFrame.add(statusLabel);
        headerLabel.setText((String) ReadFile.currentBookData[0]);
        JLabel label = new JLabel("", JLabel.CENTER);
        label.setText((String) ReadFile.currentBookData[2]);
        label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12));
        controlPanel.add(label);
        mainFrame.setVisible(true);
    }

    public void updateText() {
        headerLabel.setText((String) ReadFile.currentBookData[4]);
        statusLabel.setText((String) ReadFile.currentBookData[4]);
    }

}

6 个答案:

答案 0 :(得分:2)

您的UI课程中包含所有static个字段,这就是您需要将prepareGUI()方法标记为static的原因。谨防!每次创建UI类的对象时,只需覆盖现有的mainFrame

如果您只创建UI类的单个实例,那么最好使用Singleton模式以避免混淆。

答案 1 :(得分:1)

你正在以错误的方式解决问题。解决方案不是让一切都是静态的,而是要解决初始代码问题,以便开始时不需要静态。请理解,开发面向对象编程的原因是为了提供代码结构,降低代码复杂性并增加代码重用。通过使所有这些保持静止,你将所有的好处抛到了一边。

答案 2 :(得分:1)

对于像这样的swing代码,使成员静态似乎不是一个好的选择。这些成员是与类的一个实例相关联的事物,而不是与整个类相关联的事物。初始化构造函数中的组件是合理的,即使它们是实例成员也是如此。

Oracle教程中的示例很难实现,教程坚持使用NetBeans。但是examples for the O'Reilly Swing book很容易找到,并且它们在构造函数中初始化组件。这比使用静态字段更好。

答案 3 :(得分:1)

“修复”错误的方式违背了OOP的概念。 static方法和字段是类本身的“属性”,其中非静态方法和字段是所述类的实例(对象)的“属性”。

您应该从字段和static方法中删除prepareGUI()关键字:

//private JFrame mainFrame; you only have one instance, so no point in having a global field
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;

private /*static Should that be there? answer is no. */ void prepareGUI() {
    JFrame mainFrame = new JFrame("Holy Bible");
    (...)
}

答案 4 :(得分:0)

构造函数方法应该只初始化类成员,就是这样。最佳做法是在之后调用静态方法。

答案 5 :(得分:0)

当你想直接调用那个方法或属性时,

static是必要的。我的意思是没有从类创建一个对象 静态方法或属性可以在其他类中调用而无需像这样创建Object - > Classname.staticMethod();