美文网首页
枚举学习(一)

枚举学习(一)

作者: Hoker_ | 来源:发表于2018-12-15 21:35 被阅读0次
    近期在公司项目里发现大量使用枚举,觉得自己对这个还是不很了解,这里做一下简单记录。

    先看枚举的用法:

    public enum EnumTest {
        /**
         * 枚举一,每一个都是一个枚举类型的变量,其中括号部分是EnumTest这个类型的构造方法
         */
        ONE,
        /**
         * 枚举二
         */
        TWO,
        /**
         * 枚举三
         */
        THREE;
    }
    

    这就是最基本的用法,通过enum来定义3个枚举变量。
    在网上查资料得知,枚举本质上就是一个类,对EnumTest.class javap后可以看到:


    EnumTest.class
    • EnumTest继承于类Enum
    • EnumTest里有ONE、TWO、THREE的三个静态EnumTest类型实例
    • staic方法块是对ONE、TWO、THREE进行赋值的地方

    具体的代码如下:

    //反编译Day.class
    final class EnumTest extends Enum
    {
        //编译器为我们添加的静态的values()方法
        public static Day[] values()
        {
            return (EnumTest[])$VALUES.clone();
        }
        //编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法
        public static EnumTest valueOf(String s)
        {
            return (Day)Enum.valueOf(com/hoker/javatest/EnumTest, s);
        }
        //私有构造函数
        private EnumTest(String s, int i)
        {
            super(s, i);
        }
         //前面定义的7种枚举实例
        public static final EnumTest ONE;
        public static final EnumTest TWO;
        public static final EnumTest THREE;
        private static final EnumTest $VALUES[];
    
        static 
        {    
            //实例化枚举实例
            ONE = new EnumTest("ONE", 0);
            TWO = new EnumTest("TWO", 1);
            THREE = new EnumTest("THREE", 2);
            $VALUES = (new Day[] {
                ONE, TWO, THREE
            });
        }
    }
    

    接着再说下Enum类的几个方法:

    返回类型 方法名称 方法说明
    int compareTo(E o) 比较此枚举与指定对象的顺序
    boolean equals(Object other) 当指定对象等于此枚举常量时,返回 true
    Class<?> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象
    String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
    int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零
    String toString() 返回枚举常量的名称,它包含在声明中
    static<T extends Enum<T>> T static valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量

    知道了EnumTest是一个类,那么自然也有其自己的构造方法,显然也能有自己的成员变量

    public enum EnumTest {
        /**
         * 枚举一,每一个都是一个枚举类型的变量,其中括号部分是EnumTest这个类型的构造方法
         */
        ONE("TOME1", 1),
        /**
         * 枚举二
         */
        TWO("TOME2", 2),
        /**
         * 枚举三
         */
        THREE("TOME3", 3);
    
        private String tome;
        private int i;
    
        private EnumTest(String tome, int i) {
            this.tome = tome;
            this.i = i;
        }
    
        public String getTome() {
            return tome;
        }
    
        public void setTome(String tome) {
            this.tome = tome;
        }
    
        public int getI() {
            return i;
        }
    
        public void setI(int i) {
            this.i = i;
        }
    }
    

    具体测试的例子:


    使用例子

    一定要注意区分的是,ONE("TOME1", 1)的构造分为两部分:

    • 一部分是Enum里的构造方法调用,这块是编译器帮我们自动生成的,使用的是“ONE”和1(1是指ONE变量所在的位置)。
    • 一部分是我们之后定义的,使用的是this.tome = tome 、this.i = i;这样的赋值
    总结:到这里,枚举基本上就可以使用了,后续再介绍下枚举的一些坑,作为补充。

    相关文章

      网友评论

          本文标题:枚举学习(一)

          本文链接:https://www.haomeiwen.com/subject/svzahqtx.html