引言

单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。

Java枚举

基本用法

枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。 首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:enum Type{ A,B,C,D;}

创建enum时,编译器会自动为我们生成一个继承自java.lang.Enum的类,我们上面的enum可以简单看作:class Type extends Enum{ public static final Type A; public static final Type B; ...}

对于上面的例子,我们可以把Type看作一个类,而把A,B,C,D看作类的Type的实例。 当然,这个构建实例的过程不是我们做的,一个enum的构造方法限制是private的,也就是不允许我们调用。

“类”方法和“实例”方法

上面说到,我们可以把Type看作一个类,而把A,B。。。看作Type的一个实例。同样,在enum中,我们可以定义类和实例的变量以及方法。看下面的代码:enum Type{ A,B,C,D; static int value; public static int getValue() { return value; } String type; public String getType() { return type; }}在原有的基础上,添加了类方法和实例方法。我们把Type看做一个类,那么enum中静态的域和方法,都可以视作类方法。和我们调用普通的静态方法一样,这里调用类方法也是通过 Type.getValue()即可调用,访问类属性也是通过Type.value即可访问。下面的是实例方法,也就是每个实例才能调用的方法。那么实例是什么呢?没错,就是A,B,C,D。所以我们调用实例方法,也就通过 Type.A.getType()来调用就可以了。最后,对于某个实例而言,还可以实现自己的实例方法。再看下下面的代码:

enum Type{A{ public String getType() { return "I will not tell you"; }},B,C,D;static int value;public static int getValue() { return value;}String type;public String getType() { return type; }}

这里,A实例后面的{…}就是属于A的实例方法,可以通过覆盖原本的方法,实现属于自己的定制。 除此之外,我们还可以添加抽象方法在enum中,强制ABCD都实现各自的处理逻辑:enum Type{ A{ public String getType() { return "A"; } },B { @Override public String getType() { return "B"; } },C { @Override public String getType() { return "C"; } },D { @Override public String getType() { return "D"; } }; public abstract String getType();}

枚举单例

有了上面的基础,我们可以来看一下枚举单例的实现方法:public enum SomeThing { INSTANCE; public String get(){return "SomeThing";} }main(){SomeThing someThing=SomeThing.INSTANCE;someThing.get();}

上面的类Resource是我们要应用单例模式的资源,具体可以表现为网络连接,数据库连接,线程池等等。 获取资源的方式很简单,只要 SomeThing.INSTANCE.getInstance() 即可获得所要实例。下面我们来看看单例是如何被保证的: 首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。 也就是说,因为enum中的实例被保证只会被实例化一次,所以我们的INSTANCE也被保证实例化一次。 可以看到,枚举实现单例还是比较简单的,除此之外我们再来看一下Enum这个类的声明:public abstract class Enum> implements Comparable, Serializable

可以看到,枚举也提供了序列化机制。某些情况,比如我们要通过网络传输一个数据库连接的句柄,会提供很多帮助。 最后借用 《Effective J

ava》一书中的话,单元素的枚举类型已经成为实现Singleton的最佳方法。

本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6627542.html

,如需转载请自行联系原作者

linux 单例模式改密码,Java 利用枚举实现单例模式相关推荐

  1. java 枚举与单例模式_今天我们来聊聊单例模式和枚举

    ㊣java编程核心第2版多线程的图书 75.5元 包邮 (需用券) 去购买 > 曾经面试的时候,在说到单例模式的时候,我还是含含糊糊的,我觉得自己懂,但是又在某个结点被卡死了,所以决定写篇文章来 ...

  2. Java枚举enum以及应用:枚举实现单例模式

    枚举作为一个常规的语言概念,一直到Java5才诞生不得不说有点奇怪,以至于到现在为止很多程序员仍然更喜欢用static final的形式去命名常量而不使用,一般情况下,Java程序员用这种方式去实现枚 ...

  3. mysql linux改密码忘记了怎么办_linux上mysql改密码忘了怎么办?

    解决方法:1.在my.cnf中,增加"[mysqld]"和"skip-grant-tables"2行代码,用于登录时跳过密码验证:2.启动mysql服务,并登录 ...

  4. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例

    场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...

  5. SVN远程改密码的超简单的java实现

    SVN远程改密码的超简单的java实现java源码下载地址 对于使用VisualSVNServer的免费使用者来说,为方便用户的使用,远程改密是十分必要滴.对于只会java开发的程序员来说,按照以下的 ...

  6. linux进入单用户模式改密码,1.4linux单用户模式下修改root密码和救援模式修改root密码...

    在忘记root密码无法登入系统的情况下,有两种修改root密码的方法. 第一种:进入单用户模式下,直接修改root密码,前提是grub没有设置密码. 第二种:使用安装光盘启动,进入救援模式更改root ...

  7. java枚举类及面试题为什么枚举实现单例模式是安全的?

    目录 枚举类 为什么会有枚举类? 枚举类的使用 枚举类的常用方法 枚举的构造 枚举类型能被反射吗? 为什么枚举实现单例模式是安全的? 枚举类的优缺点 枚举类 为什么会有枚举类? 假如说程序中有一些颜色 ...

  8. java利用单例模式存储参数_java单例模式使用及注意事项

    strtok函数实际上是要把第一个参数的字符串进行修改的.因为这个原因这个字符串的存储位置就不能是只读的, 也就是说不能存放在常量区.在使用char* aa ="abcdefg"; ...

  9. linux系统root改密码忘记了怎么办,linux系统root密码忘记修改办法

    linux系统Root密码忘了怎么办?--解决办法(图解请下载附件) Root密码忘了就这么办!这个方法菜鸟实践证明可行! 1.在开机启动的时候能看到这个引导目录(3秒将进入默认),用上下方向键选择你 ...

最新文章

  1. ApacheCN 学习资源汇总 2019.3
  2. CentOS5.5支持ntfs文件系统
  3. Shiro实现认证_ini
  4. python 变量转字符串_[Python Basic] 字符串处理以及类型转换 2
  5. 将数据导入到已存在的excel文件中
  6. Ubuntu 16.04安装Chrome浏览器
  7. 十分钟让你明白AIDL
  8. DB2表结构DDL脚本导出
  9. 使用dime传输大附件的设置(WSE Soap toolkit)
  10. 【图像隐写】基于matlab FRFT+SVD盲水印嵌入+攻击+提取【含Matlab源码 1757期】
  11. makefile中文手册_如何学习GCC英文手册
  12. ios safari 模拟器_Safari调试iOS应用
  13. 手机html5跑分,吊炸天的Chrome55内核来袭 360手机浏览器成“跑分王”
  14. 在线支付接口详解、支付接口对接
  15. java坦克大战爆炸效果_用java做坦克大战--主要类和基本功能实现
  16. axure动态面板的简单介绍
  17. ECharts中Y轴坐标上标记有实心圆
  18. 苹果电脑网速怎么测试软件,macbookpro怎么检测网速?
  19. 一味顺从的人没有好果子吃
  20. c#往结构体里面读数据_C# 结构体和ListT类型数据转Json数据保存和读取

热门文章

  1. 20151208_使用windows2012配置weblogic节点管理器
  2. Vue Webpack常见问题(持续更新)
  3. 前端总结·基础篇·CSS(二)视觉
  4. 6.5 开始进入设计 … Transition to Design
  5. PHP简单实现单点登录功能示例
  6. LeetCode的二分查找的练习部分总结
  7. 单调栈3_水到极致的题 HDOJ4252
  8. !+\v1 用来“判断浏览器类型”还是用来“IE判断版本”的问题!
  9. 人物角色群体攻击判定二(叉乘来判断敌人的位置)
  10. 位图像素的颜色 携程编程大赛hdu