zoukankan      html  css  js  c++  java
  • java enum类

    1、可以在enum中添加变量和方法

    先来看一段代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public enum State {
        Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4);
        // 成员变量
        private String name;
        private int index;
     
        // 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化
        private State(String name, int index) {
          this.name = name;
          this.index = index;
        }
     
        // 普通方法
        public static String getName(int index) {
          for (State c : State .values()) {
            if (c.getIndex() == index) {
              return c.name;
            }
          }
          return null;
        }
     
        // get set 方法
        public String getName() {
          return name;
        }
     
        public void setName(String name) {
          this.name = name;
        }
     
        public int getIndex() {
          return index;
        }
     
        public void setIndex(int index) {
          this.index = index;
        }
      }

    从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。

    2、可以用来定义常量

    先来回顾一下Java中如何定义常量吧,看下面一段代码:

    1
    2
    public static final int normalState = 1;
    private static final int updateState = 2;

    下面我们还可以用enum枚举来代替上面的常量定义,代码如下:

    1
    2
    3
    public enum State {
     Normal, Update, Deleted, Fired
    }

    在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。

    3、在enum中实现接口

    先来看下面一段代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public interface ICanReadState {
        void read();
     
        String getState();
    }
     
      public enum State implements ICanReadState {
        Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4);
     
        private String name;
        private int index;
     
        private State(String name, int index) {
          this.name = name;
          this.index = index;
        }
     
        // 接口方法1
     
        @Override
        public String getState() {
          return this.name;
        }
     
        // 接口方法2
        @Override
        public void read() {
          System.out.println(this.index + ":" + this.name);
        }
      }

    和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。

    实例
    我们先定义个简单枚举(这里只是个例子,就简单定义3个变量了):

    1
    2
    3
    4
    5
    6
    public enum SqlTypeEnum {
      INSERT ,
      UPDATE ,
      DELETE ,
      SELECT
    }

    此时解析SQL后,获取出来一个token,我们要获取这个token的枚举怎么获取呢?

    这样获取:

    1
    2
    String token = "select";
    SqlTypeEnum sqlTypeEnum = SqlTypeEnum.valueOf(token.toUpperCase());

    如果没获取到,java会抛出一个异常哦:IllegalArgumentException No enum const class SqlTypeEnum.XXX

    我做大写处理的原因是因为枚举也是大写的(当然如果你的枚举是小写的,那你就小写,不过混写比较麻烦哈),其实valueOf就是调用了枚举的底层映射:

    201642785504527.jpg (575×287)

    如何避免错误使用 Enum

    不过在使用 Enum 时候有几个地方需要注意:

    1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
    2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
    3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。
  • 相关阅读:
    多线程执行有返回值有参数的方法
    当连续进行多个请求,并且请求的url地址相同时。放弃前面的所有请求,只执行最后一次请求。
    防止重复发送Ajax请求的解决方案
    多行文本溢出显示省略号
    h5 文件跨域上传
    完美解决 IOS系统safari5.0 浏览器页面布局iframe滚动条失效问题,iossafari5.0
    CSS3 修改和去除移动端点击事件出现的背景框 (tap-highlight-color)
    去除img之间的空白
    手机上点击a标签是出现阴影解决办法
    idea通过maven构建springMVC+mybatis项目
  • 原文地址:https://www.cnblogs.com/diegodu/p/6135193.html
Copyright © 2011-2022 走看看