如何防止类的实例倍增

时间:2013-11-03 18:52:30

标签: java

如何防止Scanner类的多个实例运行?有关于线程和信息的信息。锁等,但我不能让他们在我的应用程序上工作。例如,我单击Pay,然后出现Scanner实例,然后单击Cancel创建Pay。然后,当我点击付款时,扫描仪的数量翻倍。下面是一个简短的总结:

@ PlaceOrder.java,我有:

btnPay.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) 
{
    java.awt.EventQueue.invokeLater(new Runnable() 
    {
           public void run() 
           {
                 PlaceOrder.this.setVisible(false);

                 new boundary.ScannerUI().setVisible(true);  
                 PlaceOrder.this.dispose();                                 
           }
    });             

}             });

@ Scanner.java,我有:

btnCancel.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent evt)
            {
                //ScannerUI.this.setVisible(false);
                //ScannerUI.this.dispose();                     

                new boundary.PlaceOrder().setVisible(false);
                ScannerUI.this.dispose();
            }
        }); 

2 个答案:

答案 0 :(得分:0)

您需要的是Singleton-Pattern,这是一种非常常见且基本的设计模式。

基本上,单例模式提供了一个静态方法,它实例化对象(如果它尚未实例化)并返回(已经)创建的实例。

单身人士应该

  • 私有构造函数,
  • 一个静态实例,
  • 和一个静态访问方法,它创建并返回实例。

在您的情况下,ScannerUI类看起来像这样,

public class ScannerUI extends JFrame { //extending JFrame is just my assumption
// as the OP didn't provided the class declaration code


    //static instance
    private static volatile ScannerUI instance;

    //private constructor
    private ScannerUI() {
        // Do nothing.
    }

    //static access method, which will be called instead of the constructor
    //UPDATE: added isDisplayable because it is disposable.
    public static synchronized ScannerUI getInstance() {
        if (instance == null || !instance.isDisplayable()) {
            instance = new ScannerUI();
        }
        return instance;
    }
}

更新

要访问单个对象,您需要调用其公共访问器方法并像其他对象一样使用它。

ScannerUI scanUI = ScannerUI.getInstance();
scanUI.setVisible(true);
scanUI.dispose();
etc.

更新

您当然可以将私有构造函数实现为当前构造函数,您应该确保构造函数在此类之外是不可见的,因为这会违反单例的概念。

“什么都不做。”只是一个占位符,因为我不知道你的实际构造函数是什么样的。

答案 1 :(得分:-1)

如果要重用ScannerUI的单个实例,则不要调用其构造函数;而是提供工厂方法,它将创建一个实例并将其保存在静态变量中。基本理念:

static ScannerUI instance;

ScannerUI newScanner() {
   return instance == null || instance.isDisposed()? 
      instance = new ScannerUI() : instance;
}