• 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

  • 相关阅读:
    四则运算1
    四则运算3
    数组1
    四则运算单元测试
    四则运算2
    数组3
    数组2
    spring aop对service层日志和异常的处理
    Linux设置开机启动
    数据仓库开发——Kettle使用示例
  • 原文地址:https://www.cnblogs.com/noodlerkun/p/10306660.html
Copyright © 2020-2023  润新知