参考资料:《Effective Java》、《Java核心技术 卷1》、https://www.cnblogs.com/zhaosq/p/10135362.html

基础回顾

1.什么是枚举?

有时候一个变量的取值只在一个有限的集合内,比如衣服的大小,就可以用到枚举。

//自定义枚举类型
enum Size {S,M,L,X};
//声明Size类型的变量
Size size=Size.M

枚举类型只是存储这个枚举指定的变量,如上面的size只能是S,M,L,X。

实际上,enum是与类同级的,但是又不能完全当作类。

与类的区别在于:

1.类的关键字是class,枚举是enum

2.类可以在方法内部,也就是局部内部类。但是enum不能在方法内声明,只能在类的外部或者类的内部方法的外部声明。


相同点就是enum内也可以写一些构造器、方法等

2.什么是Singleton

Singleton就是单例模式,指一个类只能有一个实例。比如我们常常使用的Windows系统,大家随变点击一个系统功能的图标,比如此电脑或者垃圾箱,不管点击多少次,永远只有那一个窗口,其实这就是单例模式的一种表现。

单例模式的实现主要通过以下两个步骤:

1.将该类的构造器私有化,这样其他类就不能通过构造器实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

2.然后提供的这个静态方法需要进行判断,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

代码如下:

public class EJ01_03 {
//私有构造器仅被调用这一次,用来实例化静态final域INSTANCE
private static final EJ01_03 INSTANCE=new EJ01_03();
//私有化构造器,这样就不能实例化这个类了
private EJ01_03(){};
//外部只能调用这个方法来获取这个类的实例,但是这个方法返回的都是同一个实例
public static EJ01_03 getInstance(){
return INSTANCE;
}
}

这样就只能通过如下代码获取EJ01_03类的实例化对象。所有对getInstance的调用,都会返回同一个对象引用

EJ01_03 ej3=EJ01_03.getInstance();

用枚举实现单例

在用枚举实现单例之前,需要更深入的了解一下枚举。

枚举的定义如下:

enum Size {S,M,L,X};

但是通过编译器编译过后,上面的代码被编译成一个Size类,主要内容如下:

class Size{
public static final Size S;
public static final Size M;
public static final Size L;
public static final Size X; //实例化
static {
S=new Size();
M=new Size();
L=new Size();
X=new Size();
}
}

通过上面的代码可以看出,S、M、L、X其实都是静态的final域。

而实现单例模式正好需要一个静态的final域。所以用枚举实现单例代码如下:

class EnumSingleton{}

enum Singleton {
INSTANCE;
  //单例对象是EnumSingleton,所以需要声明一个EnumSinleton变量。
private EnumSingleton instance;
//枚举的构造方法默认是私有的,所以不需要加private
Singleton() {
instance = new EnumSingleton();
}
public EnumSingleton getInstance() {
return instance;
}
}
//使用枚举类型时会调用构造函数,然后INSTANCE在下面提到了,是唯一的,INSTANCE其实就是new Singleton()。所以可以通过INSTANCE调用getInstance()
EnumSingleton enumSingleton2=Singleton.INSTANCE.getInstance();

在Java中,每一个枚举变量都是唯一的。枚举单例的方法虽然与普通的方法相似,但是无偿的提供了序列化机制,绝对防止了多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。

创建和销毁对象——用私有构造器或者枚举类型强化Singleton属性的更多相关文章

  1. 《Effective Java》-——用私有构造器或者枚举类型强化Singleton属性

    Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统.使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Si ...

  2. 第3项:用私有构造器或者枚举类型强化Singleton属性

      Singleton指仅仅被实例化一次的类 [Gamma95].Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件.使类称为Singleton会使它的客户端测试变得 ...

  3. 用私有构造器或者枚举类型强化Singleton属性

    1.Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,如窗口管理器或者文件系统.使类称为Singleton会使它的客户端调试变的十分困难,因为无法给S ...

  4. 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性

    Singleton指只被实例化一次的类.一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类. 这个很经常使用.记得曾经实习面试的时候就有这个面试题. 一般採用的方法是将构造器私有化,然后提供一 ...

  5. 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性

    实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...

  6. 第3条:用私有构造器或者枚举类型强化Singleton属性

    Singleton是指仅仅被实例化一次的类.通过被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统. 在http://www.cnblogs.com/13jhzeng/p/5256424. ...

  7. Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性

    Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法: 1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObje ...

  8. 第三条:用私有构造器或者枚举类型强化Singleton属性

    1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...

  9. 用私有构造器或枚举类型强化Singleton

    Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ...

随机推荐

  1. Ubuntu分区方案

    swap: 4G(跟你自己内存一样大):主分区:空间起始位置:用于交换空间 /boot: 300M(太小会导致软件无法升级):逻辑分区:空间起始位置:EXT4:/boot /: 30G:主分区:空间起 ...

  2. Java学习笔记之Object常用方法

    Object:万类之祖   == : 比较的是是否是同一个对象,比较的是地址   equals: 是Object里面的方法,默认的是==,比较的是地址,但在String类型里重写为比较内容 一般我们在 ...

  3. PHP array_splice

    1.函数的作用:数组中元素的删除和替代 2.函数的参数: @params array  &$array @params int      $offset @params int      $l ...

  4. 《全栈性能测试修炼宝典JMeter实战》学习记录

    说明:原书中jmeter版本为2.x,我的笔记中截图为5.x

  5. 卡特兰(Catalan)数入门详解

    也许更好的阅读体验 基本概念 介绍 学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数 这里,我对卡特兰数做一点自己 ...

  6. C++ 大作业资料总结

    一般 C++ 大作业都是用 Qt 来写,Qt 本身带了很多例子,详见:https://doc.qt.io/qt-5/qtexamples.html# 如果你想偷懒的话,直接拿来改就好,或者去 Gith ...

  7. Android SDK安装与环境变量的配置(windows系统)

    (一)下载Android SDK压缩包 解压后即可(全英文路径,以免后续出现乱码) (1)下载地址:http://tools.android-studio.org/index.php/sdk

  8. OptimalSolution(2)--二叉树问题(3)Path路径问题

    一.在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树和一个32位整数sum,求累加和为sum的最长路径长度.路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链 -3 / ...

  9. 数组转换成List集合

    Element[] array = {new Element(1), new Element(2)};List<element> list = new ArrayList<eleme ...

  10. mysql免安装包配置

    最近在通过zip包配置mysql,mysql版本:5.7.13.配置过程中,踩了一些坑,下面做了一些简单的记录,配置的具体过程如下: 1.将mysql zip包解压,放到指定目录中,在系统环境变量中配 ...