日期:2014-05-20  浏览次数:20789 次

请教关于static 方法和单例模式问题
一个单例模式代码:
public class SingletonTest
{
  public static void main(String[] args)
  {
  Singleton singleton = Singleton.getInstance();
  Singleton singleton2 = Singleton.getInstance();

  System.out.println(singleton == singleton2);
  }
}

class Singleton
{
  private static Singleton singleton = new Singleton();
   
  private Singleton()
  {
   
  }

  public static Singleton getInstance()
  {
   
  return singleton;
  }


}

singleton 和singleton2相同,是同一个对象,为什么呢?主要就是private static Singleton singleton = new Singleton();
这一句,加了static是不是说new Singleton()只执行一次,第一次Singleton singleton = Singleton.getInstance();时加载Singleton,初始化Singleton属性,第二次
Singleton singleton2 = Singleton.getInstance();时,因为内存中有singleton属性,就不new Singleton(),直接返回原singleton呢???
请大侠给解释解释,谢谢


这里使用的是饿汉式单例,对于private static Singleton singleton = new Singleton();有解释说jvm保证singleton只被初始化一次,这是一个什么机制????

是不是可以这样理解啊,对于
private static Singleton singleton = new Singleton();
可以看成这样:
private satic Singleton singleton;
static {singleton = new Singleton(); }
因为静态块只在类加载的时候执行一次,所以不管调用多少次,private static Singleton singleton = new Singleton();只执行一次,所以也就只有一个对象了。

请问以上理解是否正确?????

------解决方案--------------------
理解不正确啊。

如果一个成员被声明为static,它是指能直接用类名点出成员名,而不必实例化对象,被static修饰的成员是类的所有实例共有的。

单例模式之所以是单例的原因是因为构造方法是私有的,你无法通过new来实例化一个Singleton的对象,而只能通过get方法来获得实例对象。

所以你两次获得的single对象是同一个。
------解决方案--------------------
探讨
第二次Singleton singleton2 = Singleton.getInstance();时,因为内存中有singleton属性,就不new Singleton(),直接返回原singleton呢???

------解决方案--------------------
类的静态属性是在类加载的时候建立的。你后边2次调用getInstance之是吧之前建立的属性对象的引用赋值给你建立的引用对象。

单例模式看名字就知道,单一的实例,也就是一个类只能被实例化一次。当然这里不是说我们建立的类只能被实例化一次,而是通过某种方法使程序中获取的所有该类的对象都为同一个对象,当然最好是只能被实例化一次,比如像楼主类似的写法 一个私有构造函数,一个私有的类成员变量,同个一个方法获得这个类成员变量对象,其他也很多种实现方式。
------解决方案--------------------
探讨
也就是说单例的维护是类本身不对外提供构造函数和自身又不改变singleton属性值来实现的,这样理解对不??