java枚举来实现单例_枚举实现单例模式
Java中的枚举和其它语言不同,它是一个对象。早期的 Java 是没有枚举类型的大家都用类似于单例的方式来实现枚举,简单的说就是让构造 private 化,在 static 块中产生多个 final 的对象实例,通过比较引用(或 equals)来进行比较,这种模式跟单例模式相似,不能由使用者产生实例,但是有多个实例——可惜,我不知道这种模式叫什么名字,有知道麻烦告知一声。
早期用类的方式实现的枚举
public class MyEnum {
public static MyEnum NumberZero;
public static MyEnum NumberOne;
public static MyEnum NumberTwo;
public static MyEnum NumberThree;
static {
NumberZero = new MyEnum(0);
NumberOne = new MyEnum(1);
NumberTwo = new MyEnum(2);
NumberThree = new MyEnum(3);
}
private final int value;
private MyEnum(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Java5 的枚举
从 Java 5 开始有枚举类型之后,类似的实现可以这样
类似类方式实现的枚举实现
public enum MyEnum {
NumberZero(0),
NumberOne(1),
NumberTwo(2),
NumberThree(3);
private final int value;
MyEnum(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
其实仔细比较会发现,就是简化了定义过程,构造方法简不能使用 public 或 protected 修饰符,如果省略也不是 package,而是 private;另外 final static 属性定义简化了,static 块也简化掉了。
当然,像这种值从 0 开始的,可以更简单的实现,getValue() 直接返回其顺序号就行。
更简单的实现方式(题外话)
public enum MyEnum {
NumberZero,
NumberOne,
NumberTwo,
NumberThree;
public int getValue() {
return ordinal();
}
}
回头说说枚举变单例
上面说了,早期就是通过类似单例模式的方式来实现的枚举。而后的枚举实例也和类方式实现极为相似,那么,如果枚举值只有 1 个的时候,其实例也就只有 1 个,就完全符合了单例模式的限定。由于 Java 的 enum 可以跟类一样任意定义方法和属性,所以就完全可以用枚举来实现单例。这是其它语言如 C++、C# 做不到的。
第二个问题
关于第二个问题,参考 @albertchendao 回答就对了。
顺便提一句,尽量还是一问一贴,便于大家分问题讨论
java枚举来实现单例_枚举实现单例模式相关推荐
- java 线程安全的单例_线程安全的单例模式的几种实现
单例模式是常见的设计模式之一:目的是节省内存,限制了实例的个数:有利于java GC回收机制. 单例模式的三个好处: 1.控制资源的使用,通过线程同步来控制资源的并发访问 2.控制实例的产生个数,来达 ...
- Java基础学习系列--(二)【抽象类,接口、代码块、final、单例、枚举】
第一章 抽象类 1.1 概述 1.1.1 抽象类引入 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子类对 ...
- 为什么我强烈建议大家使用枚举来实现单例
转载自 为什么我墙裂建议大家使用枚举来实现单例 关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题, ...
- 用枚举enum实现单例
[README] 1,effectivejava 讲到使用 枚举类实现单例的例子,非常好用: 2,好处如下: 不用定义私有构造器: 不用定义获取单例的方法,如 getInstance() :通过 枚举 ...
- 为什么我墙裂建议大家使用枚举来实现单例。
关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题,比如线程安全问题.序列化对单例的破坏等. 单例相关文 ...
- 【深入设计模式】单例模式—从源码分析内部类单例、枚举单例以及单例模式在框架中的应用
文章目录 1. 使用静态内部类实现单例模式 1.1 静态内部类单例写法 1.2 如何实现懒加载 1.3 为什么线程安全 2. 枚举类型单例单例模式 2.1 枚举类型单例写法 2.2 枚举类型单例原理 ...
- day02-抽象类,接口、代码块、final、单例、枚举
java基础[抽象类,接口.代码块.final.单例.枚举] 第一章 抽象类 1.1 概述 1.1.1 抽象类引入 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主 ...
- 静态内部类实现单例_单例模式详解
概述 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例. 单例应用场景 Windows系统的任务管理器. ...
- 单例设计模式 序列化破坏单例模式原理解析及解决方案?
单例设计模式 序列化破坏单例模式原理解析及解决方案? 序列化和反序列化 反射的破坏
最新文章
- python多重继承
- hdu 2669 Romantic
- hinton、李飞飞支持的NLP明星创企,今获1.25 亿美元B轮融资
- 图像语义分割的前世今生
- struts2实现文件查看、下载
- Spring Cloud教程– Spring Cloud Config Server简介
- 第二节: 比较EF的Lambda查询和Linq查询写法的区别
- 华为云牵手同舟共济伙伴 持续发力构建云核心生态圈
- 漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...
- Object Clustering(POJ-3214)
- 栈实现队列(队列实现栈)
- Winedt为什么可以用pdfLaTex编译中文(pdfLaTex和XeLaTex的使用)
- C语言之编程规范及细节知识(学C必看)
- 工作总结10:毕业这一年的收获
- O2OO是一个汽车故障诊断工具
- 淘宝卖家如何有效控制直通车展现?
- 媒体 | 冒志鸿:理想nine percent最难寻
- 数字摄影测量之特征点提取算法
- 企业二维码故障报修的过程演示
- 在线API文档、技术文档工具ShowDoc
热门文章
- Swiper学习之一---入门:swiper相关文件、swiper代码结构和样式、初始化Swiper
- 全国计算机二级等级考试项目有什么,全国计算机等级考试二级内容
- api接口怎么分批传递数据_新手上路:浅谈什么是API接口 API定义是什么
- php切割文件上传,php+ajax实现文件切割上传功能示例
- html5声明utf-8,HTML5中的SVG – 什么时候是XML声明`?xml version =“1.0”encoding =“UTF-8”?`需要吗?...
- python简单的编程_简单的Python2.7编程初学经验总结
- java导出excel_java按需导出Excel并自动合同单元格
- 计算机多媒体的应用 毕业论文,计算机多媒体技术(毕业论文)多媒体技术与应用.doc...
- c语言中嵌套循环的作用,C语言中n层循环嵌套实现
- java类型过滤文本_JAVA实现过滤掉文本中的表情