创建和销毁对象——用私有构造器或者枚举类型强化Singleton属性
参考资料:《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属性的更多相关文章
- 《Effective Java》-——用私有构造器或者枚举类型强化Singleton属性
Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统.使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Si ...
- 第3项:用私有构造器或者枚举类型强化Singleton属性
Singleton指仅仅被实例化一次的类 [Gamma95].Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件.使类称为Singleton会使它的客户端测试变得 ...
- 用私有构造器或者枚举类型强化Singleton属性
1.Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,如窗口管理器或者文件系统.使类称为Singleton会使它的客户端调试变的十分困难,因为无法给S ...
- 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性
Singleton指只被实例化一次的类.一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类. 这个很经常使用.记得曾经实习面试的时候就有这个面试题. 一般採用的方法是将构造器私有化,然后提供一 ...
- 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性
实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...
- 第3条:用私有构造器或者枚举类型强化Singleton属性
Singleton是指仅仅被实例化一次的类.通过被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统. 在http://www.cnblogs.com/13jhzeng/p/5256424. ...
- Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性
Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法: 1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObje ...
- 第三条:用私有构造器或者枚举类型强化Singleton属性
1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...
- 用私有构造器或枚举类型强化Singleton
Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ...
随机推荐
- [NOIp2011] luogu P1314 聪明的质监员
题目描述 点进去看吧,说的不能再清楚了. Solution 看到数据规模不难想到二分 WWW,然后用个前缀和优化一下即可.注意上下界. #include<cstdio> #include& ...
- (20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
1.必需和可选属性 如果实体属性可以包含null,则将其视为可选.如果属性的有效值不可以包含null,则将其视为必需属性.映射到关系数据库架构时,必需的属性将创建为不可为null的列,而可选属性则创建 ...
- python-函数相关
一.函数: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print(). 但你也可以自 ...
- Git推送到多个远程仓库
Git推送到多个远程仓库 Grey 原文地址 准备工作 在码云和Github上分别新建两个不包括任何文件的空仓库(若是两个已经有文件的仓库,请参见关联已经存在的项目) https://github.c ...
- docker3-镜像的使用
基本使用命令: [root@ipha-dev71- docker]# docker search python # 搜索镜像 [root@ipha-dev71- docker]# docker pul ...
- 3. Rsync-远程同步(下)-企业案例
已知3台服务器主机名分别为web01.backup .nfs主机信息见下表: 角色 外网IP(NAT) 内网IP(LAN) 主机名 WEB eth0:10.0.0.7 eth1:172.16.1.7 ...
- Asp.net Core全局异常监控和记录日志
前言 系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息.在Asp.net Core里我使用拦截器 ...
- Spring为IOC容器注入Bean的五种方式
一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.clas ...
- 中文预训练模型ERNIE2.0模型下载及安装
2019年7月,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基于此框架的ERNIE 2.0预训练模型, 它利用百度海量数据和飞桨(PaddlePaddle)多机多卡高效训练优 ...
- Spring Boot 2.X(十五):集成 Swagger2 开发 API 文档(在线+离线)
前言 相信很多后端开发在项目中都会碰到要写 api 文档,不管是给前端.移动端等提供更好的对接,还是以后为了以后交接方便,都会要求写 api 文档. 而手写 api 文档的话有诸多痛点: 文档更新的时 ...