高效Java03:使用私有构造器或枚举类型强化单例属性
来源:互联网 发布:矩阵怎么约分 编辑:程序博客网 时间:2024/05/21 14:48
单例(singleton)指仅仅只能被实例化一次的类,主要服务于一些需要保证对象只存在一个实例的场景。
实现方式一:暴露公有静态成员变量
public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton() { }}
INSTANCE
为对外暴露的成员变量,构造方法设为私有。
实现方式二:暴露公有静态方法
public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getInstance() { return INSTANCE; }}
实例成员INSTANCE
与构造方法同时设为私有,通过静态成员方法getInstance()
对外暴露访问。上面这种写法称作若饿汉模式
,另外还有一种懒汉模式
的写法,INSTANCE
类加载时不初始化,在需要使用时才初始化。
public class Singleton { private static Singleton INSTANCE = null; private Singleton() { } public static Singleton getInstance() { if (INSTANCE == null) { INSTANCE = new Singleton(); } return INSTANCE; }}
懒汉模式
存在线程安全问题,这里仅展示一下,不推荐使用。
实现方式三:包含单个元素的枚举类型
除了上面说到的两种方式,还有第三种实现单例的方法,即使用包含单个元素的枚举类型。
public enum Singleton { INSTANCE;}
枚举为什么可以实现单例?
通过对上面代码编译后的Singleton.class
反编译后得到下面的代码:
public final class Singleton extends Enum { public static final Singleton INSTANCE; private static final Singleton $VALUES[]; static { INSTANCE = new Singleton("INSTANCE", 0); $VALUES = (new Singleton[]{ INSTANCE }); } public static Singleton[] values() { return (Singleton[]) $VALUES.clone(); } public static Singleton valueOf(String name) { return Enum.valueOf(Singleton.class, name); } private Singleton(String s, int i) { super(s, i); }}
通过反编译后的代码我们可以看到,枚举实际上与我们写的普通类并无太大区别,只不过编译器帮我们简化了这部分工作。我们前面实现单例是将类的实例控制为一个,而枚举是类中定义了N个元素,则将类的实例控制为N个,所以当我们在枚举类中只定义一个元素时即可实现单例的效果。
0 0
- 高效Java03:使用私有构造器或枚举类型强化单例属性
- 用私有构造器或枚举类型强化Singleton属性
- [Effective Java Distilled] Item 3 通过使用私有构造方法或者枚举类型来强化单例属性
- [Effective Java Distilled] Item 3 通过使用私有构造方法或者枚举类型来强化单例属性
- 用私有构造器或者枚举类型强化 Singleton属性
- 用私有构造器或者枚举类型强化Singleton属性
- 用私有构造器或者枚举类型强化Singleton属性
- 用私有构造器或者枚举类型强化Singleton属性。
- 学习effective java-3创建和销毁对象之利用私有构造方法或枚举类型来强化单例的属性
- Effective java第三条:使用私有构造器或者枚举类型强化Singleton属性
- 第3条:用私有构造器或者枚举类型强化Singleton属性
- 03、用私有构造器或者枚举类型强化Singleton属性
- EffectiveJava 第3条 :用私有构造器或者枚举类型强化Singleton属性
- Effective Java (3) - 用私有构造器或者枚举类型强化Singleton属性
- 第3条:用私有构造器或者枚举类型强化Singleton属性
- 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性
- Java学习笔记3:用私有构造器或者枚举类型强化Singleton属性
- Java学习笔记3:用私有构造器或者枚举类型强化Singleton属性
- 访问者模式(Visitor)
- Scikit-Learn库使用(1)
- 20170320-leetcode-401-Binary Watch
- 5-4 任务调度的合理性 (25分)(拓扑排序)
- FATAL can not read a block mapping entry解决办法
- 高效Java03:使用私有构造器或枚举类型强化单例属性
- python核心编程---读书笔记:第21章 数据库编程
- java--12--集合概述
- Java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
- fl2440开发板的烧录流程
- 高效Java04:通过私有构造方法强化不可实例化的能力
- 20-30岁间你一定会碰到这六个坑,看到了就绕过去吧
- 人工智能各学派简介:符号主义,连接主义,行为主义
- 算法设计与应用基础