Enum与最佳単例设计
1 枚举基础
自定义一个枚举类很简单, 不过类型关键字是 enum, 不是 class, 也不是 interface.
public enum Action {
UP, DOWN, LEFT, RIGHT
}
自定义的 Action枚举 本质上还是一个 class, 反编译可以看到如下定义:
public final class Action extends Enum {...}
enum关键字 定义了特殊的类, 继承 java.lang.Enum, 由编译程序处理, 我们直接写类继承 Enum类 会被编译程序拒绝. 有必要了解下 java.lang.Enum类.
Enum 是个抽象类, 无法直接实例化.
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
private final String name;
private final int ordinal;
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
...
}
我们定义的 Action, 会继承这个 Enum, 并且四个枚举成员都将成为 static final 的 Action实例:
private Action(String s, int i){
super(s, i);
}
public static final Action UP; //其他成员略
static{
UP = new Action("UP", 0);
}
可以看出, Enum 的 name 记录了枚举成员的字符串名称, ordinal 则记录了枚举成员的加入顺序, Enum成员的排序和switch语法, 都是利用了 ordinal() 取得 int 值.
ordinal 的值是枚举成员定义的顺序(由0开始), 如果不想要这个顺序, 可以加入 int 字段来主动编号:
DOWN(2), UP(1), RIGHT(4), LEFT(3);
private int number;
private Action(int number){
this.number = number;
}
值得注意的是, 我们向上面这样加入实例变量, 重写私有构造, 最后都会编译程序作为产生真的构造函数参考之用, 实际反编译会变成这样:
private Action(String s, int i, int number){
super(s, i);
this.number = number;
}
public static final DOWN; //其他成员略
...
static{
DOWN = new Action("DOWN", 0, 2);
...
}
......
枚举成员, 在 JVM 中只会存在单一实例. //static final
--------------------------------------------------------------------------------
2 最佳単例设计
枚举类的特点, 决定了其在单例设计使用上的天然优势.
Joshua Bloch大神说过: 单元素的枚举类型已经成为实现Singleton的最佳方法.
public enum EnumSingleton {
INSTANCE;
public EnumSingleton getInstance(){
return INSTANCE;
}
}
优点:
写法简单优雅; 线程安全; 可应对反射攻击; 序列化支持..
缺点:
因为已经继承了 Enum, 所以不能再继承了.
参考:
<<JDK7学习笔记>>林信良
http://www.importnew.com/24272.html
http://www.runoob.com/design-pattern/singleton-pattern.html
http://www.cnblogs.com/chiclee/p/9097772.html
https://www.cnblogs.com/lanxuezaipiao/p/3369962.html
Enum与最佳単例设计的更多相关文章
- 年度榜单:2013年最佳免费 PSD 设计素材揭晓
<年度榜单>系列继续给大家带来2013年度发布的好东西,这篇文章要给大家分享的是本年度最佳的12套精美的 PSD 设计素材,你可以免费下载使用.这些免费素材不仅能帮助他们节省大量的时间,而 ...
- php : 单例设计演示
单例 : 保证只有一个实例 <?php /* * 单例设计 */ // 单例: 只能"创造"出它的一个对象实例 class Single{ // 第一步: 私有化构造方法 p ...
- Spring容器-ApplicationContext的单例设计
Spring容器-ApplicationContext的单例设计 每次通过new创建一个ApplicationContext容器,都会执行refresh方法,看源代码了解到这个refresh方法会 ...
- Swift中简单的单例设计
import Foundation class Test: NSObject { // 提供单例实例 static let shareInstance = Test() // 私有化构造方法 over ...
- JAVA设计模式:单例设计
1.单例设计Singleton的引出 单例设计,从名字上首先可以看出单---即只有一个,例---只的是实例化对象:那么单例也就是说一个类,只产生了一个实例化对象.但是我们都知道,一个类要产生实例化对象 ...
- 新增和修改页面的用例设计和Bug提交
问题: 新增页面和修改页面,基本上输入框都一样,那比如同一个输入框的用例设计: 1. 写了新增页面的用例,修改页面对该输入框还有再写一遍用例的必要吗? 2. 执行用例时,新增页面验证了必填项,长度,数 ...
- 用例设计之APP用例覆盖准则
基本原则 本文主要讨论APP功能用例的覆盖,基本原则: 用户场景闭环(从哪来到哪去) 遍历所有的实现逻辑路径 需求点覆盖 覆盖维度 APP功能用例设计主要使用传统的黑盒用例设计方法.同时,作为移动AP ...
- 服务端用例设计的思(tao)路!
服务端的测试简单来说就是除了前端以外的的测试. 总的来说可以分为以下两类: 1. WEB或者APP的提供业务逻辑的服务端接口测试 2. 数据库.缓存系统.中间件..jar包依赖.输入输 ...
- 分享12款最佳的Bootstrap设计工具
设计师总会渴望有一些新奇有趣的设计工具来提高工作效率,而Bootstrap就是您的不二选择.2013年Bootstrap得到了广泛普及, 它是开发者较为常用的框架之一,本文我们将分享12款最佳的Boo ...
随机推荐
- Reporting报表开发知识合并[个人原创]
[个人原创] ,转发请声明原文链接 了解 a) SSRS全称 SQL Server Reporting Services,是依赖于数据库运行的,是微软开发的重量级别的BI产品 b) ...
- GitHub 用户排行榜
排行榜预览网址:Github | Githack | UNPKG | Gitee Github 中国用户排名,全球仓库 Star 最多排名,通过 Github API v3 来生成页面数据,排行榜预览 ...
- 解决:django.db.utils.OperationalError: unable to open database file
这是一个从GitHub上下载的,一个网站项目的源码.想要在自己的电脑上运行,期间过程相当曲折,不过至此终于是完成了. 1.安装过程: python2->virtualenv->django ...
- S2:java集合框架
Java集合就是一个容器.面向对象语言对事物的体现都是以对象的形式存在,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式.集合只用于存储对象,集合长度是可变的,集合可以 ...
- 1、JAVA的小白之路
大学的时光过得很快,转眼我已经大二了,在大一时,学习了C\C++,对于语言有一定基础,在未来的道路上,我需要攒足干劲,积累足够的知识和技能,去走上社会. 我的第一任大学班主任告诉我:“作为程序员,你至 ...
- zookeeper基本知识入门(一)
之前我们在搭建hadoop分布式环境的时候用到过Zookeeper注册hadoop服务.那么到底Zookeeper在分布式环境中发挥了什么作用呢,这次我们就来讨论这个问题. 在分布式系统中通常都会有多 ...
- centos虚拟机配置静态ip
昨天在配置虚拟机的时候因为之前没有设置静态IP,而是使用DHCP动态分配的,导致关机后下次开机虚拟机的ip是随机变动的.严重影响了工作体验啊,遂设置静态ip以保全! 虚拟机使用的是CentOS6.5, ...
- java并发编程(十一)----(JUC原子类)基本类型介绍
上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong ...
- 算法与数据结构基础 - 位运算(Bit Manipulation)
位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...
- [转载]使用Java操作Mongodb
HelloWorld程序 学习任何程序的第一步,都是编写HelloWorld程序,我们也不例外,看下如何通过Java编写一个HelloWorld的程序. 首先,要通过Java操作Mongodb,必须先 ...