我们都知道单例模式中类的实例变量要设成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();生成了实例对象

解决方案 »

  1.   

    if(new Singleton().instance==null) //第一个对象
            new Singleton().instance=new Singleton();//第2个,第3个
            return new Singleton().instance ;//第4个你返回的是第4个对象的成员变量,而这个成员变量你还没给它赋值单例模式只是一种手段,人为地把它设为单例,让外部的人无法调用它的构造函数。当你在对它可见的范围内new一个对象,它当然不止一个对象
      

  2.   

    你这种写法根本就不是单例模式了!public class Singleton {
        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
        }
    }
      

  3.   

    just like what 2# said
    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 ;
    }
      

  4.   


    public class Singleton1 {    private Singleton1(){
            System.out.println("*****创建实例*******");
        }
        private static Singleton1 instance=new Singleton1();
        public static Singleton1 getInstance(){
            return instance;
        }
    }