如何防止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();
}
});
答案 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;
}