参考资料:《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. 教你用Vue写一个开心消消乐

    之前做过一个算法题,算法要求就是写一个开心消消乐的逻辑算法,当时也是考虑了一段时间才做出来.后来想了想,既然核心算法都有了,能不能实现一个开心消消乐的小游戏呢,于是花了两天时间做了一个小游戏出来. 效 ...

  2. NOIP2009 Hankson 的趣味题 : 数论

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解 ...

  3. opencv::AKAZE检测与匹配

    AKAZE局部匹配 AKAZE局部匹配介绍 AOS 构造尺度空间 Hessian矩阵特征点检测 方向指定基于一阶微分图像 描述子生成 与SIFT.SUFR比较 更加稳定 非线性尺度空间 AKAZE速度 ...

  4. 达孚电子(NDF)参加2019年印度电子元器件展圆满成功

    2019年9月27日-29日,达孚电子(NDF)参加2019年印度国际电子元器件及生产设备展览会在印度国际展览中心举得圆满成功,为期三天的展会中,打造了一场电子元器件行业交流的饕餮盛宴. 本次展会取得 ...

  5. 百万年薪python之路 -- 推导式

    2.1列表推导式 首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10: li = [] for i in range(1,11): li.append(i) print(li) ...

  6. 百万年薪python之路 -- 变量及if的练习

    1.简述变量命名规范 1.变量由数字,字母,下划线组成 2.不能以数字开头 3.不能使用python关键字 4.不能使用中文和拼音命名 5.区分大小写 6.变量名要具有描述性 7.推荐写法 7.1驼峰 ...

  7. Intellij idea 一个窗口打开多模块并添加依赖

    打开多模块 ctrl+alt+shift+s 或者file->project sturcture 选择modules 添加 选择要添加的模块 选择从现有模块添加,不要选择从现在代码创建模块 添加 ...

  8. .Net Core3.0依赖注入DI

    构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法. 不使用依赖注入 首先,我们创建一个ASP.NET Core Mvc项目, ...

  9. Nginx在Window上简单的使用

    先上Nginx在Window上的基本常用指令: IP_hase也可以解决Session共享的问题:不过不推荐这样使用,建议使用 Memcache/redis来处理 session共享的问题 轮询还是权 ...

  10. json基础用法

    JSON格式 JSON格式(JavaScript Object Notation的缩写)是一种用于数据交换的文本格式,2001年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式 ...