使用枚举构造Singleton对象

来源:互联网 发布:华策招聘 知乎 编辑:程序博客网 时间:2024/05/16 05:23

单例的常见写法:

私有构造器与静态成员

public class SimpleSingletonY {    public static final SimpleSingletonY INSTANCE = new SimpleSingletonY();    private SimpleSingletonY() {    }}

静态工厂

public class SimpleSingletonX {    private static final SimpleSingletonX INSTANCE = new SimpleSingletonX();    private SimpleSingletonX() {    }    public static SimpleSingletonX getInstance() {        return INSTANCE;    }}

Double Check与懒加载

public class DoubleCheckSingleton {    private static volatile DoubleCheckSingleton INSTANCE = null;    private DoubleCheckSingleton() {}    public static DoubleCheckSingleton getInstance() {        if (INSTANCE == null) {            synchronized (DoubleCheckSingleton.class) {                if (INSTANCE == null) {                    INSTANCE = new DoubleCheckSingleton();                }            }        }        return INSTANCE;    }}

懒加载可以避免JVM在加载Singleton这个类时对INSTANCE初始化操作(如果new的过程很耗时的话,应用程序启动的会很慢,降低体验的友好性,只在使用的时候进行初始化操作。

另一种安全高效的懒加载实现方式

public class StaticLazyLoadSingleton {    private StaticLazyLoadSingleton() {}    private static class LazyHolder {        static final StaticLazyLoadSingleton INSTANCE = new StaticLazyLoadSingleton();    }    public static StaticLazyLoadSingleton getInstance() {        return LazyHolder.INSTANCE;    }}

使用枚举

public enum EnumSingleton {    INSTANCE;    int value;    public int getValue() {        return value;    }    public void setValue(int value) {        this.value = value;    }}

https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

https://dzone.com/articles/java-singletons-using-enum?fromrel=true

阅读全文
0 0
原创粉丝点击