一个关于单实例的问题

最近在写一个虚拟教室的东东,其实也不是什么特难的东东,只是用到了我们以前未用过的新东东罢了,比如说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值


[size=large][color=red]下面是问题的所在:
其实此处并不是一个单例模式,而是可以创建多个实例的,当你多次new的时候,会调用init方法,从而又会有一个frame属性,通过getInstance方法使其创建一个新的对象,从而出现了两个对象了,因此主函数中用new方法创建的对象并不是用getInstance方法创建的对象,因而会出现类似不同的通道一样的,从而是对不同JList的操作,自然两个对象中的组件也不同。从而会出现上面的问题儿。
至于上面的为什么测试会出现true值,主要是因为当调用getInstance方法的时候是对静态变量frame进行了一次新的赋值,当调用new方法创建对象的时候frame属性为null值,当再次调用getInstance方法的时候就给frame赋了新值了,从而会是同一个,自然返回true。[/color][/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值