• java 枚举


    枚举是一种特殊的数据,它的取值是有限的,是可以枚举出来的,比如一年有四季、一周有七天。虽然使用类也可以处理这种数据,但枚举类型更为简洁、安全和方便。

    枚举的好处体现在以下几方面。

    • 定义枚举的语法更为简洁。
    • 枚举更为安全。一个枚举类型的变量,它的值要么为null,要么为枚举值之一,不可能为其他值,但使用整型变量,它的值就没有办法强制,值可能就是无效的。
    • 枚举类型自带很多便利方法(如values、valueOf、toString等),易于使用。

    基础使用:

    public enum Size {
        SMALL, MEDIUM, LARGE
    }
    public class Main_5_4_1 {
    
        public static void main(String[] args) {
    
            // 使用Size
            Size size = Size.MEDIUM;
    
            Size size = Size.SMALL;
            // 枚举变量的toString方法返回其字面值,所有枚举类型也都有一个name()方法,返回值与toString()一样
            System.out.println(size.toString()); // SMALL
            System.out.println(size.name()); // SMALL
    
            Size size = Size.SMALL;
            // 枚举变量可以使用equals和==进行比较,结果是一样的
            System.out.println(size == Size.SMALL); // true
            System.out.println(size.equals(Size.SMALL));// true
            System.out.println(size == Size.MEDIUM);// false
    
            Size size = Size.MEDIUM;
            // 枚举值是有顺序的,可以比较大小。枚举类型都有一个方法int or-dinal(),表示枚举值在声明时的顺序,从0开始
            System.out.println(size.ordinal()); // 1
    
            Size size = Size.SMALL;
            // 枚举类型都实现了Java API中的Comparable接口,都可以通过方法compareTo与其他枚举值进行比较。比较其实就是比较ordinal的大小
            System.out.println(size.compareTo(Size.MEDIUM)); // -1
    
            // 枚举还可以用于switch语句
            onChosen(Size.MEDIUM);
    
            // 枚举类型都有一个静态的valueOf(String)方法,可以返回字符串对应的枚举值
            System.out.println(Size.SMALL==Size.valueOf("SMALL")); // true
    
            // 枚举类型也都有一个静态的values方法,返回一个包括所有枚举值的数组,顺序与声明时的顺序一致
            for (Size size : Size.values()) {
                System.out.println(size); // 输出为三行,分别是SMALL、MEDIUM、LARGE。
            }
    
        }
    
        static void onChosen(Size size) {
            switch (size) {
                case SMALL:
                    System.out.println("chosen small");
                    break;
                case MEDIUM:
                    System.out.println("chosen medium");
                    break;
                case LARGE:
                    System.out.println("chosen large");
                    break;
            }
        }
    }

    典型场景:

    /**
     * Created by xc on 2019/11/17
     * 代码清单5-13 带有实例变量和方法的枚举类Size
     */
    public enum Size {
    
        // 枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。
        SMALL("S", "小号"), MEDIUM("M", "中号"), LARGE("L", "大号");
    
        /**
         * 缩写
         */
        private String abbr;
        /**
         * 中文名称
         */
        private String title;
    
        private Size(String abbr, String title) {
            this.abbr = abbr;
            this.title = title;
        }
    
        public String getAbbr() {
            return abbr;
        }
    
        public String getTitle() {
            return title;
        }
    
        /**
         * 根据缩写返回对应的枚举值。
         *
         * @param abbr 缩写
         * @return
         */
        public static Size fromAbbr(String abbr) {
            for (Size size : Size.values()) {
                if (size.getAbbr().equals(abbr)) {
                    return size;
                }
            }
            return null;
        }
    }

    上述代码定义了两个实例变量abbr和title,以及对应的get方法,分别表示缩写和中文名称;定义了一个私有构造方法,接受缩写和中文名称,每个枚举值在定义的时候都传递了对应的值;同时定义了一个静态方法fromAbbr,根据缩写返回对应的枚举值。需要说明的是,枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。这个枚举定义的使用与其他类类似,比如:

    public class Main_5_4_2 {
    
        public static void main(String[] args) {
            Size s = Size.MEDIUM;
            System.out.println(s.getAbbr()); //输出M
            s = Size.fromAbbr("L");
            System.out.println(s.getTitle()); //输出“大号”
        }
    
    }

    参考:java编程逻辑5.4

  • 相关阅读:
    bzoj2064分裂(dp)
    关于逆元的学习笔记(尚未完成)
    线性基学习笔记
    bzoj2460元素(线性基,贪心)
    CF280C Game on tree(期望dp)
    XJOI contest800
    关闭极域电子教室学生端的各种方法
    大坑!有网,电脑qq登不上去!!
    4.25 ZJOI2017 10AM
    bzoj1621
  • 原文地址:https://www.cnblogs.com/ooo0/p/11875717.html
Copyright © 2020-2023  润新知