Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单件模式:静态还是静态最终?_Java_Design Patterns_Static_Singleton_Final - Fatal编程技术网

Java 单件模式:静态还是静态最终?

Java 单件模式:静态还是静态最终?,java,design-patterns,static,singleton,final,Java,Design Patterns,Static,Singleton,Final,最好将单例实例声明为static或static final 请参见以下示例: 静态版本 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } } public cla

最好将单例实例声明为
static
static final

请参见以下示例:

静态
版本

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }

}
public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

}
静态最终版
版本

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }

}
public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

}

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

public class Singleton {

    private static Singleton instance = null;

    private Singleton() {
    }

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

}
这样,即使应用程序根本不使用实例,也不需要始终保存实例。
只在应用程序第一次需要时创建它。

在您的特定情况下,没有任何区别。你的第二个已经是了

但是

撇开下面的实现不是线程安全的这一事实不谈,只是显示了与final的区别

在延迟初始化实例的情况下,您可能会感觉到不同。看起来很懒

public class Singleton {

    private static Singleton INSTANCE; /error

    private Singleton() {
    }

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

}

如果您不想偷懒(并进行偷懒初始化),那么您可能希望将其设置为final,因为您可以(有意地)这样做:

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

我建议使用
Singleton
而不是使用
Enum

@alex2410这只是为了在最终版本中有所不同。这不是线程安全的问题。@alex2410同样,这不是一个解决方案。我在第一行中给出了区别。在已经实施的解决方案中,没有任何可用性。这只是为了显示
static final
static
之间的差异。了解实现。线程安全还取决于对象的其他字段。OP的问题是关于是否是最终的……我不明白这个解决方案:为什么是这段代码?@user-这一条解释了为什么在OP的当前代码中使用
final