参考资料:《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. 渗透测试-基于白名单执行payload--Compiler

    复现亮神课程 0x01 Compiler前言 说明:Microsoft.Workflow.Comiler.exe是.NET Framework默认自带的一个实用工具,用户能够以XOML工作流文件的形式 ...

  2. 在Ubuntu16.0.4安装hipcaffe

    1. 安装 AMD ROCm 显卡条件 要安装AMD的 ROCm显卡,必须满足以下条件,只能高于下面信息版本,不能低于. Distribution Kernel GCC GLIBC x86_64 Fe ...

  3. 5分钟读懂Linux权限管理

    权限管理: 本文用于初学者对Linux文件系统权限的快速了解!! 进程安全上下文:   进程对文件的访问权限应用模型:     进程的属主与文件的属主是否相同:如果相同,则应用属主权限:      否 ...

  4. Vue 上传材料并传给后端接口(使用input)

    最近工作中接到一个需求,需要上传一个文件材料,提交时传给后端.使用的框架是Vue,废话不说直接上代码 <template> <div> <input type=" ...

  5. css3实现饼状图进度及环形进度条

    1 <!-- 饼图 --> <div class="pie"></div> <hr /> <!-- 环形图 --> &l ...

  6. 算法<初级> - 第二章 队列、栈、哈希表相关问题

    算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...

  7. typescript 入门教程二

    ts中面向对象成员修饰符:public , private , protexted(ts官方网站:ts) 在ts中,默认的成员修饰符就是public public:是表示是公开的,在任何地方,都可以调 ...

  8. 基于SEER的区块链版赛亚麻将游戏Pre alpha版本内测啦!

    游戏基于SEER测试网络文体平台模块(Culture and Sports Platform,CSP),正在进行数据调试等工作,大家可以尝鲜体验. 此游戏账户和资金等核心系统完全基于区块链,但目前运行 ...

  9. Django之多对多表之through第三张表之InlineModelAdmin后台内嵌

    话不多说,来看表结构 这里有两个表,一个是阶段表,一个是老师表,一个老师可以带多个阶段,一个阶段也可以由多个老师带,所以是多对多关系 # 阶段表 class Stage(models.Model): ...

  10. requests+lxml+xpath爬取电影天堂

    1.导入相应的包 import requests from lxml import etree 2.原始ur url="https://www.dytt8.net/html/gndy/dyz ...