2013-11-03 75 views
0

如何防止运行Scanner类的多个实例?有关于线程&锁等信息,但我不能让他们在我的应用程序上工作。例如,我点击付款,然后出现一个扫描器实例,然后点击取消创建付款。然后,当我点击付费时,扫描仪的数量就会增加一倍。下面有一个简短的摘要:如何防止类的实例繁殖

@ 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

http://en.wikipedia.org/wiki/Singleton_pattern? – Evans

回答

-1

如果你想重用的ScannerUI单个实例,然后永远不调用其构造函数;而是提供工厂方法,它将创建一个实例并将其保存在一个静态变量中。基本思路:

static ScannerUI instance; 

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

谢谢,我感谢你的帮助,但我不明白。 'instance.isDisposed()'产生一个错误。另外,我怎么能将这个应用到上面2个类的方法? – user2945412

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; 
    } 
} 

UPDATE

要访问一个单独的对象,你需要调用它的公共访问方法和使用它像其他对象。

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

UPDATE

你当然可以实现私有构造函数你现在的一个,你应该确保,即构造是不是这个类的外部可见的,因为这将侵犯单身的概念。

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

+0

只需注意ScannerUI是一个可丢弃的对象,并且在使用OP代码后确实被丢弃。我认为应该关注这个问题。 –

+0

谢谢,但如果我有另一个名为ScannerUI()的构造函数呢?这意味着我不能像上面那样提供私有构造函数?基于这个问题,我如何从Pay按钮正确访问这个Scanner类? – user2945412

+0

@MarkoTopolnik thx,错过了那一个。 – Pr0gr4mm3r