zoukankan      html  css  js  c++  java
  • JAVA中的枚举小结

    枚举

    将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用;

    枚举基本特性

    以下代码是枚举的简单使用:

    使用values方法返回enum实例的数组

    使用ordinal方法返回每个enum实例的次序,从0开始

    使用compareTo方法比较两个enum实例

    使用==来比较enum实例

    使用getDeclaringClass方法返回enum实例所属的enum类

    使用valueOf方法根据指定的名字返回enum实例

    package enumerated;
    
    enum Shrubbery {
        GROUND, CRAWLING, HANGING
    }
    
    public class EnumClass {
        public static void main(String[] args) {
            for (Shrubbery s : Shrubbery.values()) {
                System.out.println(s + " ordinal: " + s.ordinal());
                System.out.println(s.compareTo(Shrubbery.CRAWLING) + " ");
                System.out.println(s.equals(Shrubbery.CRAWLING) + " ");
                System.out.println(s == Shrubbery.CRAWLING);
                System.out.println(s.getDeclaringClass());
                System.out.println(s.name());
                System.out.println("----------------------");
            }
            // Produce an enum value from a string name:
            for (String s : "HANGING CRAWLING GROUND".split(" ")) {
                Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
                System.out.println(shrub);
            }
        }
    }

    注意枚举enum默认是继承自java.lang.Enum类的,在以上代码中,Shrubber为一个枚举类, GROUND, CRAWLING, HANGING为这个enum类的实例,由于Shrubber已经继承自java.lang.Enum类,所以它是不能在继承其它enum类的

    另外,在使用枚举的时候,可以考虑使用静态导入枚举类型,省去使用枚举类型修饰枚举实例;

    向enum中添加方法

    enum基本上是可以被看做一个常规的类,可以向其添加方法,甚至main方法;

    如下代码,在枚举类内部添加一个构造方法和getDescription方法, 注意,当定义自己方法的时候,需要在enum实例序列的最后一个后面添加分号,且要先定义enum实例再定义方法;

    package enumerated;
    
    public enum OzWitch {
        // Instances must be defined first, before methods:
        WEST("Miss Gulch, aka the Wicked Witch of the West"), 
        NORTH("Glinda, the Good Witch of the North"), 
        EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"), 
        SOUTH("Good by inference, but missing");
        private String description;
    
        // Constructor must be package or private access:
        private OzWitch(String description) {
            this.description = description;
        }
    
        public String getDescription() {
            return description;
        }
    
        public static void main(String[] args) {
            for (OzWitch witch : OzWitch.values())
                System.out.println(witch + ": " + witch.getDescription());
        }
    }

    再看一个例子,覆盖Enum类的方法,如下代码,覆盖toString方法,将枚举的name首字母大写,其余转为小写,:

    package enumerated;
    
    public enum SpaceShip {
        SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;
        public String toString() {
            String id = name();
            String lower = id.substring(1).toLowerCase();
            return id.charAt(0) + lower;
        }
    
        public static void main(String[] args) {
            for (SpaceShip s : values()) {
                System.out.println(s);
            }
        }
    }

    在switch中使用枚举

    如下代码是枚举在switch语句中的使用,注意在case语句里,枚举实例前面是不需要写上枚举类型的,强行写上(如Signal.RED)编译器会报错;

    package enumerated;
    
    // Define an enum type:
    enum Signal {
        GREEN, YELLOW, RED,
    }
    
    public class TrafficLight {
        Signal color = Signal.RED;
    
        public void change() {
            switch (color) {
            // Note that you don't have to say Signal.RED
            // in the case statement:
            case RED:
                color = Signal.GREEN;
                break;
            case GREEN:
                color = Signal.YELLOW;
                break;
            case YELLOW:
                color = Signal.RED;
                break;
            }
        }
    
        public String toString() {
            return "The traffic light is " + color;
        }
    
        public static void main(String[] args) {
            TrafficLight t = new TrafficLight();
            for (int i = 0; i < 7; i++) {
                System.out.println(t);
                t.change();
            }
        }
    }

    关于枚举中的values()方法

    我们已经知道枚举类是继承java.lang.Enum类的,但是查看Enum源代码却没有发现有values()方法,那么values()方法是哪里来的呢?

    答案是,values()方法是由编译器添加的静态方法,有兴趣可以利用反射机制去查看,如上面的例子,可以编写如下代码查看:

    Method[] methods = Signal.class.getMethods();

     其它补充

    看一个例子就好,如下:

    基本可以把枚举当成一个类来使用;

    //Color继承自Enum
    public enum Color {
    
        //Color实例
        RED("Red"), 
        YELLOW("Yellow"), 
        //Color实例,继承自Color
        BLUE("Blue") {
            @Override
            public String getDescription() {
                //调用父类的test方法,BLUE实例是继承自Color的
                super.test();
                return super.getDescription();
            }
            //重写父类Color的toString方法
            @Override
            public String toString() {
                return "蓝色";
            }
        };
        
        private String description;
    
        private Color(String description) {
            this.description = description;
        }
    
        public String getDescription() {
            return description;
        }
        
        //重写父类Enum的toString方法
        @Override
        public String toString() {
            return this.description;
        }
    
        public void test() {
            System.out.println("hi~");
        }
    
        public static void main(String[] args) {
            //调用Color.BLUE实例的getDescription方法
            Color.BLUE.getDescription();
            
            //Color.RED是Color的一个实例,Color继承自Enum
            Enum<Color> red = Color.RED;
            System.out.println(red);//调用Color的toString
            
            //调用Color.BLUE的toString
            System.out.println(Color.BLUE);
    
        }
    }

    参考资料:JAVA编程思想--4

  • 相关阅读:
    HDU 5875 Function 2016 ACM/ICPC Asia Regional Dalian Online
    LCA-tarjan understand 2
    LCA-tarjan understand
    MST-prim ElogV
    MST-kruskal ElogE+V
    transformjs 污染了 DOM?是你不了解它的强大
    检查浏览器支持Webp
    canvas实现平铺水印
    2016年总结--成长
    微信小程序体验(1):携程酒店机票火车票
  • 原文地址:https://www.cnblogs.com/chenpi/p/5330959.html
Copyright © 2011-2022 走看看