单例模式简介及由它引出的JAVA局部静态变量问题

来源:互联网 发布:菜鸟网络2017校园招聘 编辑:程序博客网 时间:2024/05/11 20:08
  单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供实例。
单例模式类的特点:
  • 只能有一个实例;
  • 自己创建这个实例;
  • 整个系统都使用这个实例。
先看一般的单例模式类,类名为SingletonClass,定义如下:
public class SingletonClass {    private static SingletonClass singleton;       private SingletonClass(){    }    public static  SingletonClass getInstance(){        if(singleton == null){            singleton = new SingletonClass();        }        System. out.println(singleton);        return singleton ;    }}
在类中定义了一个SingletonClass类对象引用singleton,注意它前面的关键字static,表明他是静态变量。同时,注意类的构造函数的作用域是private,这样做的目的是使得要得到该类的实例只能通过后面的静态方法getInstance()得到。
     下面定义一个测试类Test,其定义如下:
public class Test {    public static void main(String[] args) {        System. out.println("singletoninstance1" );        SingletonClass. getInstance();        System. out.println("singletoninstance2" );        SingletonClass. getInstance();      }}
测试结果如下:
singletoninstance1com.learning.singleton.SingletonClass@c17164singletoninstance2com.learning.singleton.SingletonClass@c17164
注意两次得到的对象是同一个。
     我们可以做些尝试,修改下类,比如将对象引用定义为 private SingletonClass singleton,这样得到的结果是:在getInstance方法中会报错Cannot make a static reference to the non-static field singleton,大概的意思是不能将静态引用赋值给飞静态变量singleton。但问题是在方法中语句new SingletonClass();返回的是静态引用吗?这个咱们再做个测试,在方法中定义一个对象,然后将其引用赋给singleton:


还是报同样的错误Cannot make a static reference to the non-static field singleton,这是什么原因呢?难道说在静态方法中创建的对象引用也是静态的吗?
     在网上查的些资料说静态方法中的变量只是局部变量,从上面的例子看似乎没那么简单。也有说静态方法中的变量就是静态的,这种说法有点符合上面的测试结果,但是在方法外部又访问不了该变量。那到底静态方法中的变量到底是什么呢?只能说它是局部静态变量了。也不知道这样讲是否正确,希望大家指正。
     最后注意下getInstance()方法中的if判断语句,在这个例子中如果少了该判断那就会产生多个实例了,也违背了单例模式的思想了。

0 0
原创粉丝点击