Enum与最佳単例设计

Posted noodlerkun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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与最佳単例设计的主要内容,如果未能解决你的问题,请参考以下文章

在Enum中存储Http响应的最佳方法

软件需求分架构设计与建模最佳实践

API设计与开发之最佳实践

与数据库进行父子进程通信的最佳设计

灵雀云携手微软:畅谈“微服务架构设计与最佳实践”

Apache RocketMQ背后的设计思路与最佳实践