【问题标题】:Singleton pattern: static or static final?单例模式:静态还是静态最终?
【发布时间】:2015-09-03 08:58:02
【问题描述】:

最好将单例实例声明为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;
    }

}

【问题讨论】:

  • 阅读here 了解实施情况。

标签: java design-patterns static singleton final


【解决方案1】:

在您的特定情况下,根本没有区别。而你的第二个已经是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;
    }

}

【讨论】:

  • @alex2410 这只是为了在最终情况下有所不同。不是线程安全的问题。
  • @alex2410 这又不是一个解决方案。我在第一行给出了自己的区别。已经实施的解决方案中没有。这只是为了说明static finalstatic 的不同之处。
【解决方案2】:

如果你不想变得懒惰(并且做 懒惰初始化),那么你可能想要让它 final,因为你可以(有意地)做这样的事情:

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

我建议Singleton 使用Enum 而不是这个。

【讨论】:

  • 我不明白这个解决方案:为什么要这段代码?
  • @user - 这解释了为什么在 OP 的当前代码中使用 final 是件好事
【解决方案3】:

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

public class Singleton {

    private static Singleton instance = null;

    private Singleton() {
    }

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

}

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

【讨论】:

  • 线程安全还取决于对象的其他字段。 OP的问题是关于是否是最终的......
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
相关资源
最近更新 更多