用Java编写单例的不同方法


问题内容

用Java编写单例的经典过程是这样的:

public class SingletonObject
{
    private SingletonObject()
    {
    }

    public static SingletonObject getSingletonObject()
    {
      if (ref == null)
          // it's ok, we can call this constructor
          ref = new SingletonObject();
      return ref;
    }

    private static SingletonObject ref;
}

并且如果需要在多线程情况下运行,可以添加synced关键字。

但是我更喜欢这样写:

public class SingletonObject
{
    private SingletonObject()
    {
        // no code req'd
    }

    public static SingletonObject getSingletonObject()
    {
      return ref;
    }

    private static SingletonObject ref = new SingletonObject();
}

我认为这更简洁,但是奇怪的是我没有看到以这种方式编写的任何示例代码,如果以这种方式编写代码,会不会有不好的效果?


问题答案:

您的代码与“示例代码”之间的区别在于,加载类时将实例化您的单例,而在“示例”版本中,直到实际需要时才实例化它。