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枚举来实现单例_枚举实现单例模式相关推荐

  1. java 线程安全的单例_线程安全的单例模式的几种实现

    单例模式是常见的设计模式之一:目的是节省内存,限制了实例的个数:有利于java GC回收机制. 单例模式的三个好处: 1.控制资源的使用,通过线程同步来控制资源的并发访问 2.控制实例的产生个数,来达 ...

  2. Java基础学习系列--(二)【抽象类,接口、代码块、final、单例、枚举】

    第一章 抽象类 1.1 概述 1.1.1 抽象类引入 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子类对 ...

  3. 为什么我强烈建议大家使用枚举来实现单例

    转载自   为什么我墙裂建议大家使用枚举来实现单例 关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题, ...

  4. 用枚举enum实现单例

    [README] 1,effectivejava 讲到使用 枚举类实现单例的例子,非常好用: 2,好处如下: 不用定义私有构造器: 不用定义获取单例的方法,如 getInstance() :通过 枚举 ...

  5. 为什么我墙裂建议大家使用枚举来实现单例。

    关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题,比如线程安全问题.序列化对单例的破坏等. 单例相关文 ...

  6. 【深入设计模式】单例模式—从源码分析内部类单例、枚举单例以及单例模式在框架中的应用

    文章目录 1. 使用静态内部类实现单例模式 1.1 静态内部类单例写法 1.2 如何实现懒加载 1.3 为什么线程安全 2. 枚举类型单例单例模式 2.1 枚举类型单例写法 2.2 枚举类型单例原理 ...

  7. day02-抽象类,接口、代码块、final、单例、枚举

    java基础[抽象类,接口.代码块.final.单例.枚举] 第一章 抽象类 1.1 概述 1.1.1 抽象类引入 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主 ...

  8. 静态内部类实现单例_单例模式详解

    概述 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例. 单例应用场景 Windows系统的任务管理器. ...

  9. 单例设计模式 序列化破坏单例模式原理解析及解决方案?

    单例设计模式 序列化破坏单例模式原理解析及解决方案? 序列化和反序列化 反射的破坏

最新文章

  1. python多重继承
  2. hdu 2669 Romantic
  3. hinton、李飞飞支持的NLP明星创企,今获1.25 亿美元B轮融资
  4. 图像语义分割的前世今生
  5. struts2实现文件查看、下载
  6. Spring Cloud教程– Spring Cloud Config Server简介
  7. 第二节: 比较EF的Lambda查询和Linq查询写法的区别
  8. 华为云牵手同舟共济伙伴 持续发力构建云核心生态圈
  9. 漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...
  10. Object Clustering(POJ-3214)
  11. 栈实现队列(队列实现栈)
  12. Winedt为什么可以用pdfLaTex编译中文(pdfLaTex和XeLaTex的使用)
  13. C语言之编程规范及细节知识(学C必看)
  14. 工作总结10:毕业这一年的收获
  15. O2OO是一个汽车故障诊断工具
  16. 淘宝卖家如何有效控制直通车展现?
  17. 媒体 | 冒志鸿:理想nine percent最难寻
  18. 数字摄影测量之特征点提取算法
  19. 企业二维码故障报修的过程演示
  20. 在线API文档、技术文档工具ShowDoc

热门文章

  1. Swiper学习之一---入门:swiper相关文件、swiper代码结构和样式、初始化Swiper
  2. 全国计算机二级等级考试项目有什么,全国计算机等级考试二级内容
  3. api接口怎么分批传递数据_新手上路:浅谈什么是API接口 API定义是什么
  4. php切割文件上传,php+ajax实现文件切割上传功能示例
  5. html5声明utf-8,HTML5中的SVG – 什么时候是XML声明`?xml version =“1.0”encoding =“UTF-8”?`需要吗?...
  6. python简单的编程_简单的Python2.7编程初学经验总结
  7. java导出excel_java按需导出Excel并自动合同单元格
  8. 计算机多媒体的应用 毕业论文,计算机多媒体技术(毕业论文)多媒体技术与应用.doc...
  9. c语言中嵌套循环的作用,C语言中n层循环嵌套实现
  10. java类型过滤文本_JAVA实现过滤掉文本中的表情