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与最佳単例设计的更多相关文章

  1. 年度榜单:2013年最佳免费 PSD 设计素材揭晓

    <年度榜单>系列继续给大家带来2013年度发布的好东西,这篇文章要给大家分享的是本年度最佳的12套精美的 PSD 设计素材,你可以免费下载使用.这些免费素材不仅能帮助他们节省大量的时间,而 ...

  2. php : 单例设计演示

    单例 : 保证只有一个实例 <?php /* * 单例设计 */ // 单例: 只能"创造"出它的一个对象实例 class Single{ // 第一步: 私有化构造方法 p ...

  3. Spring容器-ApplicationContext的单例设计

    Spring容器-ApplicationContext的单例设计   每次通过new创建一个ApplicationContext容器,都会执行refresh方法,看源代码了解到这个refresh方法会 ...

  4. Swift中简单的单例设计

    import Foundation class Test: NSObject { // 提供单例实例 static let shareInstance = Test() // 私有化构造方法 over ...

  5. JAVA设计模式:单例设计

    1.单例设计Singleton的引出 单例设计,从名字上首先可以看出单---即只有一个,例---只的是实例化对象:那么单例也就是说一个类,只产生了一个实例化对象.但是我们都知道,一个类要产生实例化对象 ...

  6. 新增和修改页面的用例设计和Bug提交

    问题: 新增页面和修改页面,基本上输入框都一样,那比如同一个输入框的用例设计: 1. 写了新增页面的用例,修改页面对该输入框还有再写一遍用例的必要吗? 2. 执行用例时,新增页面验证了必填项,长度,数 ...

  7. 用例设计之APP用例覆盖准则

    基本原则 本文主要讨论APP功能用例的覆盖,基本原则: 用户场景闭环(从哪来到哪去) 遍历所有的实现逻辑路径 需求点覆盖 覆盖维度 APP功能用例设计主要使用传统的黑盒用例设计方法.同时,作为移动AP ...

  8. 服务端用例设计的思(tao)路!

    服务端的测试简单来说就是除了前端以外的的测试. 总的来说可以分为以下两类: 1.     WEB或者APP的提供业务逻辑的服务端接口测试 2.     数据库.缓存系统.中间件..jar包依赖.输入输 ...

  9. 分享12款最佳的Bootstrap设计工具

    设计师总会渴望有一些新奇有趣的设计工具来提高工作效率,而Bootstrap就是您的不二选择.2013年Bootstrap得到了广泛普及, 它是开发者较为常用的框架之一,本文我们将分享12款最佳的Boo ...

随机推荐

  1. 微信小程序设计总结

    微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序提供了一个简单.高效的应用开发框架和丰富的组件及API,帮助开发者在微信中开发具有原生 A ...

  2. .NET Core CSharp初级篇 类的生命历程

    .NET Core CSharp初级篇 1-7 本节内容为类的生命周期 引言 对象究竟是一个什么东西?对于许多初学者而言,对象都是一个非常抽象的知识点.如果非要用一句话描述,我觉得"万物皆对 ...

  3. rabbitMQ_rpc(六)

    远程过程调用(RPC) 在前面我们已经学习了如何使用工作队列在多个消费者之间分配耗时的任务. 但是如果我们需要在远程计算机上运行功能并等待结果怎么办?那将会是一个不同的故事.此模式通常称为远程过程调用 ...

  4. Windows cmd用语

    windows cmd用语.    shutdown: -l 注销                               -s 关闭计算机                             ...

  5. Gridea+GitHub搭建个人博客

    某日闲余时间看到一篇介绍Gridea博客平台的文章,大概看了一下觉得此平台还不错,随即自己进入Gridea官网瞅了瞅.哇,这搭建过程也太简单了吧,比Hexo博客搭建要容易很多,而且还有后台管理客户端, ...

  6. hdoj 4706 Children's Day

    题目意思就是用a-z组成一个N,然后到z后又跳回a,输出宽从3到10的N. #include <stdio.h> #include <string.h> char s[14][ ...

  7. MOCTF-WEB-writeup

    MOCTF-WEB-writeup 好菜,除了简单的几个题,自己会做,难的都是看老大WP完成的,太菜了 啥姿势都不会,就此记录一下,供日后查看及反省.菜鸡的自我修养 0x01 一道水题 题目链接:ht ...

  8. 邮件服务配置(虚拟域&虚拟用户)

    邮件服务配置(虚拟域&虚拟用户) 现在我做的是: Linux + httpd + php + mariadb + postfix + dovecot + phpMyAdmin + postfi ...

  9. Vue监听键盘回车事件

    在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...

  10. Echarts图表插件(4.x版本)使用(二、带分类筛选的多个图表/实例化多个ECharts,以关系图/force为例)

    导读 如果想在一个页面里实例化带分类筛选的多个Echarts该怎么做呢? 曾探讨了带分类选择的关系图显示为自定义图片的需求实现,传送门ECharts图表插件(4.x版本)使用(一.关系图force节点 ...