Java中继承java.lang.Enum

来源:互联网 发布:led显示屏软件通用版 编辑:程序博客网 时间:2024/06/06 10:51

Java 5新增的enum关键词,可以定义枚举类。该类是一个特殊的类,可以定义自己的field、方法、可以实现接口,也可以定义自己的构造器。

但枚举类使用enum定义后在编译后默认继承了java.lang.Enum类,而不是普通的继承Object类。enum声明类继承了Serializable和Comparable两个接口。且采用enum声明后,该类会被编译器加上final声明(同String),故该类是无法继承的。枚举类的内部定义的枚举值就是该类的实例(且必须在第一行定义,当类初始化时,这些枚举值会被实例化)。

由于这些枚举值的实例化是在类初始化阶段,所以应该将枚举类的构造器(如果存在),采用private声明(这种情况下默认也是private)。

另外补充一点,由于JVM类初始化是线程安全的,所以可以采用枚举类实现一个线程安全的单例模式。

链接:https://www.zhihu.com/question/19908744/answer/30946346

参考代码:

public static final class AutoOffsetReset extends Enum {        public static AutoOffsetReset[] values() {            return (AutoOffsetReset[]) $VALUES.clone();        }        public static AutoOffsetReset valueOf(String name) {            return (AutoOffsetReset) Enum.valueOf(com / sf / kafka / api / consume / ConsumeOptionalConfig$AutoOffsetReset, name);        }        public String getValue() {            return value;        }        public static final AutoOffsetReset BEGIN;        public static final AutoOffsetReset NOW;        public static final AutoOffsetReset CUSTOM;        private String value;        private static final AutoOffsetReset $VALUES[];        static {            BEGIN = new AutoOffsetReset("BEGIN", 0, "smallest");            NOW = new AutoOffsetReset("NOW", 1, "largest");            CUSTOM = new AutoOffsetReset("CUSTOM", 2, "custom");            $VALUES = (new AutoOffsetReset[] {                    BEGIN, NOW, CUSTOM            });        }        private AutoOffsetReset(String s, int i, String value) {            super(s, i);            this.value = value;        }    }
0 0
原创粉丝点击