我们都知道单例模式中类的实例变量要设成static,单例模式代码为:
public class Singleton1 { private Singleton1(){
System.out.println("*****创建实例*******");
}
private static Singleton1 instance=null;
public static Singleton1 getInstance(){
if(instance==null)
instance=new Singleton1();
return instance;
}
}
如果把static去除,改成如下:
public class Singleton {
private Singleton instance=null;
private Singleton(){
System.out.println("实例创建.........");
}
public static Singleton getInstance(){
if(new Singleton().instance==null) /*debug 测试跟踪显示:new Singleton().instance=null 一直都是
new Singleton().instance=new Singleton();
return new Singleton().instance ;
}
}
测试代码为:
public class TestS { public static void main(String[] args) {
Singleton o1=Singleton.getInstance();//o1 debug测试中生成的也是=null;
Singleton o2=Singleton.getInstance();//o2 debug测试中生成的也是=null;
if(o1==o2){
System.out.println("o1/o2是同一个对象");
}else{
System.out.println("o1/o2不是同一个对象");
}
System.out.println("end===========");
}
}
谁能够解释下红色地方为什么是为null,在单例模式中不是有new Singleton().instance=new Singleton();生成了实例对象
public class Singleton1 { private Singleton1(){
System.out.println("*****创建实例*******");
}
private static Singleton1 instance=null;
public static Singleton1 getInstance(){
if(instance==null)
instance=new Singleton1();
return instance;
}
}
如果把static去除,改成如下:
public class Singleton {
private Singleton instance=null;
private Singleton(){
System.out.println("实例创建.........");
}
public static Singleton getInstance(){
if(new Singleton().instance==null) /*debug 测试跟踪显示:new Singleton().instance=null 一直都是
new Singleton().instance=new Singleton();
return new Singleton().instance ;
}
}
测试代码为:
public class TestS { public static void main(String[] args) {
Singleton o1=Singleton.getInstance();//o1 debug测试中生成的也是=null;
Singleton o2=Singleton.getInstance();//o2 debug测试中生成的也是=null;
if(o1==o2){
System.out.println("o1/o2是同一个对象");
}else{
System.out.println("o1/o2不是同一个对象");
}
System.out.println("end===========");
}
}
谁能够解释下红色地方为什么是为null,在单例模式中不是有new Singleton().instance=new Singleton();生成了实例对象
new Singleton().instance=new Singleton();//第2个,第3个
return new Singleton().instance ;//第4个你返回的是第4个对象的成员变量,而这个成员变量你还没给它赋值单例模式只是一种手段,人为地把它设为单例,让外部的人无法调用它的构造函数。当你在对它可见的范围内new一个对象,它当然不止一个对象
private Singleton instance=null;
private Singleton(){
System.out.println("实例创建.........");
}
public static Singleton getInstance(){
if(new Singleton().instance==null) //new操作产生了一个新的实例
new Singleton().instance=new Singleton();//两次new操作又产生两个实例
return new Singleton().instance ;//返回时进行new操作又差生一个实例,这个新的实例的instance是没赋值的,当然debug打印的时候是 null
}
}
if(new Singleton().instance==null){
new Singleton().instance=new Singleton();
return new Singleton().instance ;
}"new Singleton()" should be replaced with "instance".if(instance==null){
instance=new Singleton();
return instance ;
}
public class Singleton1 { private Singleton1(){
System.out.println("*****创建实例*******");
}
private static Singleton1 instance=new Singleton1();
public static Singleton1 getInstance(){
return instance;
}
}