• Java——枚举enum


    枚举
    我认为:枚举简单的说也可以一种数据类型,只不过是这种数据类型只包含我们自定义的数据,它是一组有共同特性的数据的集合。举个简单例子,颜色也可以定义成枚举类型,它可以包含你自定义的任何颜色,当需要的时候,只需要通过枚举调用即可,另外比如季节(春夏秋冬)、星期(星期一到星期日)、衣服的号码(S、M、L、XL)等等这些具有共同特性的数据都可以定义枚举。

    下面是个例子:
    public class EnumTest {
    
        public static void main(String[] args) {
            Scanner in =  new Scanner(System.in);
            System.out.println("请输入:");
            String input=in.next().toUpperCase();
            Size size=Enum.valueOf(Size.class,input);
            System.out.println("size="+size);
            System.out.println("abbreviation="+size.getAbbreviation());
            if(size==Size.EXTRA_LAGRE){
                System.out.println("Good job!");
            }
        }    
        
        enum Size{
            SMALL("S"),MEDIUM("M"),LAGRE("L"),EXTRA_LAGRE("XL");
            
            private String abbreviation;
    
            private Size(String abbreviation){
                this.abbreviation=abbreviation;
            }
    
            public String getAbbreviation() {
                return abbreviation;
            }        
        }
        
    }

    枚举的定义

    枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

    public enum SizeEnum {
        SMALL,MEDIUM,LAGRE,EXTRA_LAGRE;    
    }

    这段代码实际上调用了4次 Enum(String name, int ordinal)

    new Enum<SizeEnum>("SMALL",0);
    new Enum<SizeEnum>("MEDIUM",1);
    new Enum<SizeEnum>("LAGRE",2);
    new Enum<SizeEnum>("EXTRA_LAGRE",3);

    枚举的常用方法

    static Enum valueOf(Class enumClass, String name)

          返回指定名字、给定义的枚举常量。

    String name()

          返回枚举常量的名称

    String toString()

          返回枚举的常量名称 比name更常用。

    int ordinal()

          返回枚举值在枚举中的位置(索引),从0开始。

    int compareTo(E other)

          如果返回枚举常量在other之前,则返回一个负值;如果this==other,则返回0;否则返回正常值。枚举常量出现的次序在enum声明中给出。

    下面是个例子:

    public static void main(String[] args){
                Size size =Size.MEDIUM;
                System.out.println(size);//MEDIUM
                System.out.println(size.name());//MEDIUM
                System.out.println(size.ordinal());//1
                System.out.println(Size.valueOf("MEDIUM").toString());//MEDIUM
                System.out.println(Size.values().length);//4  获取枚举长度
            }

    枚举的遍历

    public static void main(String[] args){
            for(Size size:Size.values()){
                System.out.println(size);
            }
        }

     

    枚举的EnumSet,EnumMap 的应用

    public class Test {
    
        public static void main(String[] args) {
            // EnumSet的使用
            EnumSet<SizeEnum> sizeSet = EnumSet.allOf(SizeEnum.class);
            for (SizeEnum size : sizeSet) {
                System.out.println(size);
            }
     
            // EnumMap的使用
            EnumMap<SizeEnum, String> sizeMap = new EnumMap(SizeEnum.class);
            sizeMap.put(SizeEnum.SMALL, "S号");
            sizeMap.put(SizeEnum.MEDIUM, "M号");
            sizeMap.put(SizeEnum.LAGRE, "L号");
            sizeMap.put(SizeEnum.EXTRA_LAGRE, "XL号");
            System.out.println(sizeMap+"-----sizeMap");
            // 循环输出EnumMap值
            for (Iterator<Entry<SizeEnum, String>> iter = sizeMap.entrySet().iterator(); iter.hasNext();) {
                Entry<SizeEnum, String> entry = iter.next();
                System.out.println(entry.getKey().name() + ":" + entry.getValue());
            }
        }
    }

    enum 经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。

    枚举特点

    1.用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。

    2.枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰。

    3.枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。

    4.枚举类型的变量值能存储这个类型声明中给定的某个枚举值或者null值,null表示这个变量没有设置任何值。

    5.如果比较两个枚举类型de值,永远不要调用equals,直接使用“==”就可以了。

    6.枚举也可以像一般的类一样添加方法和属性,可以为它添加静态和非静态的属性或方法。

    例如:

    public enum Gender {
    
        MALE("男"), FEMALE("女");
        private String name;
    
        private Gender(String name) {
            this.name = name;
        }
    
        public String getName() {
            return this.name;
        }
    
        public String toString() {
            String name = null;
            switch (this) {
            case MALE:
                name = "男";
                break;
            case FEMALE:
                name = "女";
                break;
            }
            return name;
        }
    }
  • 相关阅读:
    awk 字符串函数
    C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
    Redis 命令总结
    个人网站和博客赚钱之路(转)
    二叉树的前序、中序、后序遍历与创建
    16个值得个人站长做的广告联盟[转自cnzz]
    mysql 添加[取消]timestamp的自动更新
    转:函数式编程初探
    可爱的 Python : Python中的函数式编程,第三部分
    可爱的 Python : Python中函数式编程,第二部分
  • 原文地址:https://www.cnblogs.com/iCcccy/p/4663695.html
Copyright © 2020-2023  润新知