单身模式:静态还是静态最终?

时间:2015-09-03 08:58:03

标签: java design-patterns static singleton final

最好将Singleton的实例声明为staticstatic final

请参阅以下示例:

static版本

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }

}

static final版本

public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

}

3 个答案:

答案 0 :(得分:2)

在您的特定情况下,完全没有区别。而你的第二个已经是effectively final

但是

不考虑以下实现不是线程安全的事实,只是显示与final的区别。

如果您的实例延迟初始化,您可能会感觉不同。看起来很懒惰的初始化。

public class Singleton {

    private static Singleton INSTANCE; /error

    private Singleton() {
    }

    public static Singleton getInstance() {
      if (INSTANCE ==null) {
         INSTANCE = new Singleton(); //error
      }
        return INSTANCE;
    }

}

答案 1 :(得分:0)

如果您不想懒惰(并进行延迟初始化),那么您可能希望将其设为final,因为您可以(故意)执行以下操作:

class Sample {
   static Object o = new Object(); // o is not final. Hence can change.
    static{
     o = new Object();
     o = new Object();
    }
}

我建议使用Singleton代替此Enum

答案 2 :(得分:-2)

人们仅使用static来解释延迟初始化

public class Singleton {

    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null)
             instance = new Singleton();
        return instance;
    }

}

这样,即使您的应用程序根本不使用它,也不需要始终持有实例。 仅在应用程序第一次需要时才创建它。