zoukankan      html  css  js  c++  java
  • 枚举类型

    创建一个枚举类的时候默认继承Enum,所以无法再继承其他的类,但是可以实现多个接口。而且编译器编译的时候会将枚举类标记为final所以也不会被继承,以下是一个最基础的枚举类

    package cn.ghaien.demo;
    public enum EnumDemo1 {
        OBJECT_1, OBJECT_2, OBJECT_3
    }

    使用javac编译后

    package cn.ghaien.demo;
    
    public enum EnumDemo1 {
        OBJECT_1,
        OBJECT_2,
        OBJECT_3;
    
        private EnumDemo1() {
        }
    }

    再使用javap进行反编译

    public final class cn.ghaien.demo.EnumDemo1 extends java.lang.Enum<cn.ghaien.demo.EnumDemo1> {
      public static final cn.ghaien.demo.EnumDemo1 OBJECT_1;
      public static final cn.ghaien.demo.EnumDemo1 OBJECT_2;
      public static final cn.ghaien.demo.EnumDemo1 OBJECT_3;
      public static cn.ghaien.demo.EnumDemo1[] values();
      public static cn.ghaien.demo.EnumDemo1 valueOf(java.lang.String);
      static {};
    }

    枚举类常用的方法


    • name:获取某个实例声明时的名称
    • ordinal:获取某个实例在枚举类中声明的序号(从0开始)
    • compareTo:通过实例在枚举类中的声明顺序进行比较大小
    • getDeclaringClass:返回某个实例的Class对象
    • valueOf:Enum中的方法需要传两个参数一个是枚举类的Class对象一个是实例的名称,返回该实例对象
    • equal:比较是否是同一个对象,即使用‘==’比较
    • toString:返回实例的名称
      System.out.println(EnumDemo1.OBJECT_1.name());
      System.out.println(EnumDemo1.OBJECT_2.ordinal());
      System.out.println(EnumDemo1.OBJECT_3.getDeclaringClass());
      System.out.println(EnumDemo1.OBJECT_2.compareTo(EnumDemo1.OBJECT_3));
      System.out.println(EnumDemo1.OBJECT_1.equals(EnumDemo1.OBJECT_2));
      System.out.println(EnumDemo1.valueOf(EnumDemo1.class, "OBJECT_2"));
      /** output
       *  OBJECT_1
       *  1
       *  class cn.ghaien.demo.EnumDemo1
       *  -1
       *  false
       *  OBJECT_2
       */

      以上这些方法都是Enum类中的方法,从上面反编译后的代码可以看出,当创建一个枚举类的时候编译器会自动帮你添加以下两个方法

    • values:返回枚举类中所有实例的数组
    • valueOf:该方法只有一个字符串类型的参数, 返回名称为该参数的实例
      EnumDemo1[] values = EnumDemo1.values();
      for (EnumDemo1 value : values)
          System.out.print(value.name() + " ");
      System.out.println("
      " + EnumDemo1.valueOf("OBJECT_1"));
      /**
       * OBJECT_1 OBJECT_2 OBJECT_3
       * OBJECT_1 
       */

    枚举类与switch


    在switch中使用enum,是enum提供的一个非常有用的功能。一般来说在switch中只能使用整数值,而枚举类中的每个实例都具有一个整数值的次序,即通过ordinal方法获得,使得enum可以与switch结合使用

    enum Color {
        RED, YELLOW
    }
    public class TrangeColor {
        Color color = Color.RED;
        public void change() {
            switch(color) {   
                case RED: //这里不能使用Color.RED
                    color = Color.YELLOW;
                    break;
                case YELLOW:
                    color = Color.RED;
                    break;
            }
        }
    }            

    枚举类中重载构造器


    与普通的类一样,编译器会帮我们自动生成一个默认的无参构造器,而且我们也可以重载多个构造器。在日常的开发中我们经常需要将某个状态值与状态信息进行绑定,我们就可以通过在枚举类中重载构造器来实现这个功能,代码如下

    public enum StatusEnum {
        INVALID(1, "失效"),
        VALID(2, "有效");
        private Integer value;
        private String msg;
        StatusEnum(Integer value, String msg) {
            this.value = value;
            this.msg = msg;
        }
        public static String getMsgByValue(Integer value) {
            StatusEnum[] status = StatusEnum.values();
            for (StatusEnum statu : status) {
                if (statu.value.equals(value)) {
                    return statu.msg;
                }
            }
            throw new RuntimeException("错误的value值");
        }
    }

    通过调用getMsgByValue方法我们就可以获取某个状态值对应的状态信息,当然我们也可以直接将实例的名称命名为状态的信息,这样我们就可以只需要含有一个参数的构造器来实现这个功能

    注意:若想在枚举类中定义属性或方法,那必须在枚举实例序列的最后一个后面加上‘;’,并且只能放在在枚举实例序列的后面,否则会直接编译错误。枚举类中的构造器只能在其内部创建实例。

    枚举类与抽象方法


    在枚举类中可以直接定义抽象方法,但是每个实例必须得实现所有的抽象方法,否则编译错误,枚举类中的实例实现抽象方法的代码如下

    public enum ColorEnum {
        RED {
            public String getColor() { return "红色"; }
        },
        GREEN {
            public String getColor() { return "绿色"; }
        },
        BALCK {
            public String getColor() { return "黑色"; }
        };
        abstract String getColor();
    }
  • 相关阅读:
    px和rem换算
    使用Android Studio创建Android项目
    Hopscotch
    AtCoder Grand Contest 010 --C:Cleaning
    Hello world!
    概率生成函数
    FFT 学习笔记
    扩展中国剩余定理(excrt)
    组合恒等式
    常见数列
  • 原文地址:https://www.cnblogs.com/guohaien/p/7412742.html
Copyright © 2011-2022 走看看