首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个关于单实例的有关问题

2012-10-26 
一个关于单实例的问题最近在写一个虚拟教室的东东,其实也不是什么特难的东东,只是用到了我们以前未用过的

一个关于单实例的问题
    最近在写一个虚拟教室的东东,其实也不是什么特难的东东,只是用到了我们以前未用过的新东东罢了,比如说JGroups等。
    在写一个swing的界面时候碰到一个关于单例程的问题,在毛哥的帮助下,得到了解决...
   下面我写了一个简单的界面东西,把问题展示出来。由于代码简单就没写注释了。相信大家都能看懂的。
这个类没什么问题

package test;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JList;/** *  * @author ljp * */public class JListTestFrame extends JFrame{private static JList list;private static DefaultListModel model;private static JListTestFrame frame;private JButton btn;public static JListTestFrame getInstance(){if(frame==null){frame=new JListTestFrame();}return frame;}public JListTestFrame(){init();}public void init(){btn=new JButton();list=new JList();model=new DefaultListModel();list.setModel(model);setLayout(new BorderLayout());add(list,BorderLayout.CENTER);add(btn,BorderLayout.SOUTH);setSize(200,200);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);btn.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){new JListThread().start();}});}public static DefaultListModel getModel(){return model;}public static JListTestFrame getFrame(){return frame;}public static void main(String args[]){new JListTestFrame().setVisible(true);}}

下面这个类就存在问题了
package test;import javax.swing.DefaultListModel;/** *  * @author ljp * */    public class JListThread extends Thread{public void run(){JListTestFrame frame=JListTestFrame.getInstance();DefaultListModel model=frame.getModel();int i=0;while(i<10){String name="list -"+i;model.addElement(name);i++;}}}

大家运行就知道了,这结果表明,所加的列并没有加到JList中,但是当我稍微改下,即把run()方法中的第一行改成
JListTestFrame frame=JListTestFrame.getFrame();

这样就行了,能加进去了...
更加让人觉得不可思议的是当我测试下面的代码时
JListTestFrame.getInstance().equals(frame);

居然返回的是true值


下面是问题的所在:
其实此处并不是一个单例模式,而是可以创建多个实例的,当你多次new的时候,会调用init方法,从而又会有一个frame属性,通过getInstance方法使其创建一个新的对象,从而出现了两个对象了,因此主函数中用new方法创建的对象并不是用getInstance方法创建的对象,因而会出现类似不同的通道一样的,从而是对不同JList的操作,自然两个对象中的组件也不同。从而会出现上面的问题儿。
至于上面的为什么测试会出现true值,主要是因为当调用getInstance方法的时候是对静态变量frame进行了一次新的赋值,当调用new方法创建对象的时候frame属性为null值,当再次调用getInstance方法的时候就给frame赋了新值了,从而会是同一个,自然返回true。 1 楼 yeowin 2008-08-07   呵,确实是个伪singleton,记得单实例的一大特点就是构造函数是用private修饰的 2 楼 nijiaben 2008-08-08   恩,知识确实应该追求精益求精...

热点排行