深耕静禅_Java_枚举_2020年4月4日14:22:55

  近日整理SE中遗漏忽略点,始于注解而溯至枚举。往日教学从未提起此物,今日于网络寻找资料且若乎若离,本为理所应当掌握之事,如今百无一阅实乃惭愧。心中成纲先学性质与特性谋以面试所问,后学创建与使用聊以日常阅码困惑,瑾此谱写此章,如有遗漏日后再补。——2020年4月4日

概述

  • 自第五版本引入。

  • 亦一种类尔,但使用enum声明创建此类,亦可使用构造、属性、方法,可实现零或多接口,但无法实现继承,即无有子类。

  • 枚举类型不可通过new创建可用实例,语法约束所在。

  • 永为单例,枚举无法使用new创建,且无法反射,即实现最终极的单例效果。且对序列化做优化处理,可防止于序列化中创建新对象,一称反序列化。

  • 枚举类中可使用全大写单词创建多个“元素”,这些元素将代表当前枚举类实例所用,此元素代表实例,外部无法手动创建故称单例,但多个元素之间不为一例。亦曰,枚举类之实例可有元素控制个数,各枚举元素不可外部复制获得。

  • 所有的枚举类将默认继承Enum类,并从中获得非私有方法,但不可直接手写,只能默认。

  • 枚举类中可存在构造,可对类中各元素进行控制(因各元素皆为此类之实例),且只能使用private私有修饰。

创建枚举类

  • 枚举有enum关键字创建,其中直接可书写全大写枚举元素。

  • 如果只存在单个枚举元素,可忽略前后分号。但若枚举元素后存在其他成员,即要添加分号分隔。

  • 单个枚举中可存在多个枚举元素,多个元素使用逗号隔开,最后一个元素后加分号。

    扫描二维码关注公众号,回复: 10472830 查看本文章
  • 枚举类中的单个或一组元素的声明要放在枚举类首位,其他成员之上,此为语法所限制。

    public enum Color{
        BLACK
    }
    public enum Color{
        BLACK;//当存在其他成员,元素要在首位
        public String ColorName = "彩色";
    }
    public enum Color{
        BLACK,RED,GREEN;
    }
  • 枚举中,各元素皆代表其实例,枚举类之中构造皆为各元素构造,若书写构造为有参则默认构造消失,只可使用其有参构造,即要在各元素中对其进行传值创建,但传入参数不可对元素中内容进行操作:

    public enum TestEnum{
        ONE("1"),TWO("2");
        private TestEnum(String en){}
    }

使用枚举类

  • 可在外部直接调用枚举类中某元素进行输出,实则输出其toString方法,为当前枚举类元素名。

    public class Main{
        public static void main(String[] args){
            System.out.println(Color.BLACK);//BLACK
        }
    }
  • 此处元素所调用的toString方法即Enum所有,因所有枚举类皆继承于此类。此类中toString方法为返回当前实例之name属性,为String类型,即对象之名。

    public abstract class Enum<E extends Enum<E>>{
        private final String name;
        public String toString(){
            return name;
        }
    }
  • 枚举类中各个元素都代表其实例,此实例继承抽象类Enum可获得其普通方法,间接可获得所有Object中的非私有方法。

    方法名 作用
    name() 与toString相同,获得其名称
    ordinal() 获得序号,从0开始,表示元素顺序
    valueOf() 传入元素名称,获得其实例,实则可以直接通过元素名获得
    getDeclaringClass() 返回此元素所在枚举类
    getClass() 同样与getDeclaringClass相同,获取其枚举类,但在某情况下会出现差别
  • 在switch中可传入枚举值进行判断输出:

    public enum TestEnum{
        ONE,TWO;
    }
    public class Main{
        public static void main(String[] args){
            choice(TestEnum.ONE);
        }
        
        public static void choice(TestEnum e){
            switch(e){
                case ONE:
                    ...;
                    break;
                case TWO:
                    ...;
                    break;
            }
        }
    }
  • 枚举元素皆继承父Enum类,其父Enum存在有参构造方法可对单个元素赋值。但无法手动调用,只可在编译时自动赋值所用。

  • 枚举类中可存在抽象方法,其各元素为其实例,若为实例则必不可存在抽象方法,则要在各元素后书写大括号,实现对其抽象方法之覆盖。亦可用此方式在多个不同枚举对象中调用方法获取不同内容:

    /*
        1. 创建一枚举类型且创建两元素。
        2. 创建全局属性,使各个元素均拥有。
        3. 对构造方法进行修改,修改为:修改全局属性内容所用。
        4. 将各元素修改为:调用有参构造函数创建自身包含实例。
        5. 创建抽象方法,用于返回全局属性。
        6. 各元素皆重写此方法,用于返回全局属性。
        
        至此可实现:通过构造函数对枚举类中各个元素的属性进行赋值,且调用其自定义方法获取值。
    */
    public enum TestEnum{
        private String msg;//此处属性为各元素中所含实例均有,用于保存构造内容
        
        ONE("one"){
            public abstract void sayHi(){
                return msg;
            }
        },
        TWO("two"){
            public abstract void sayHi(){
                return msg;
            }
        };
        
        //此处创建有参构造,将无参默认构造消除,且注意其修饰必为私有:
        private TestEnum(String msg){
            this.msg = msg;
        }
        
        //此处创建抽象方法,要在各元素后添加方法实现:
        public abstract String sayHi();
    }

猜你喜欢

转载自www.cnblogs.com/agoodjavaboy/p/12631731.html