zoukankan      html  css  js  c++  java
  • java高新技术-枚举

    1.什么是枚举

    枚举是jdk1.5后才增加的新特性

    用枚举就是要规定一个新的类型,那么要用这个类型的值就必须是我规定的那些值。如果不是那些值,编译器就会报错,好处是编译时就会做出判断

    2.用普通类模拟枚举的实现原理

      

    package com.java.javaenhance1;
    /**
     * 用普通的java类,来实现枚举的原理
     * 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
     * @author Administrator
     *
     */
    public class WeekDay {
    
        private WeekDay() {
        }
    
        public final static WeekDay SUN = new WeekDay();
        public final static WeekDay MON = new WeekDay();
    
        public WeekDay nextDay() {
            if (this == SUN) {
                return MON;
            } else {
                return SUN;
            }
        }
    
        public String toString() {
            return this == SUN ? "SUN" : "MON";
        }
    
    }
    package com.java.javaenhance1;
    
    public class EnumTest {
    
        public static void main(String[] args) {
    
            WeekDay weekDay = WeekDay.SUN;
            System.out.println(weekDay.nextDay()); //MON
            System.out.println(weekDay.toString());  //SUN
        }
    
    }

    这里还可以使用抽象方法的方式实现nextDay(),就将大量的if.else语句转义成了一个个独立的类。

    package com.java.javaenhance1;
    /**
     * 用普通的java类,来实现枚举的原理
     * 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
     * @author Administrator
     *
     */
    public abstract class WeekDay {
    
        private WeekDay() {
        }
    
        //带一个{} 表示匿名子类
        public final static WeekDay SUN = new WeekDay(){
    
            @Override
            public WeekDay nextDay() {
                return MON;
            }
        };
        public final static WeekDay MON = new WeekDay(){
    
            @Override
            public WeekDay nextDay() {
                return SUN;
            }
        };
    
        //还可以使用抽象类的方式,各自实现nextDay()
        /*public WeekDay nextDay() {
            if (this == SUN) {
                return MON;
            } else {
                return SUN;
            }
        }*/
        //nextDay分别有子类去完成
        public abstract WeekDay nextDay();
    
        public String toString() {
            return this == SUN ? "SUN" : "MON";
        }
    
    }

    3.java5的枚举的基本应用

    package com.java.javaenhance1;
    
    public class EnumTest {
    
        public static void main(String[] args) {
    
            WeekDay weekDay2 = WeekDay.FRI;
            System.out.println(weekDay2); //FRI 枚举自己实现了toString()
            System.out.println(weekDay2.name());//FRI
            System.out.println(weekDay2.ordinal());  //5 元素中排第几,第一个从0开始
            //把一个字符串变成一个对象的枚举元素
            System.out.println(WeekDay.valueOf("SUN")); //SUN
            //把枚举中的所有元素装进数组里,可用于遍历
            System.out.println(WeekDay.values().length); //7
        }
        
        /**
         * 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
         * @author Administrator
         *
         */
        public enum WeekDay{
            SUN,MON,TUE,WED,THI,FRI,SAT
        }
    
    }

    4.实现带有构造方法的枚举(带有参数的构造方法)

    /**
         * 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
         * @author Administrator
         *
         */
        public enum WeekDay{
            SUN(1),MON,TUE,WED,THI,FRI,SAT;  //定义的所有其他信息必须位于元素之后
            private WeekDay(){System.out.println("first");}    //构造方法必须是private类型的
            private WeekDay(int day){System.out.println("second");}
        }

    在枚举元素的后边跟上一个括号,()中的参数代表元素初始化时用的哪个构造方法,如果没有(),表示调用默认空参构造器

    5.实现带有抽象方法的枚举

    内部类前边可以有4中访问修饰符,外部类只有两种,public和默认

    带有抽象方法的枚举,元素需要实现抽象的方法,使用RED{} 匿名子类的方式

    RED(30) 表示构造实例对象时用的是哪个构造方法

    public enum TrafficLamp{
            RED(30){  //使用内部类方式实现抽象类
                @Override
                public TrafficLamp nextLamp() {
                    return GREEN;
                }
            },
            GREEN(45){
                @Override
                public TrafficLamp nextLamp() {
                    return YELLOW;
                }
            },
            YELLOW(5){
                @Override
                public TrafficLamp nextLamp() {
                    return RED;
                }
            };
            public abstract TrafficLamp nextLamp();
            private int time;
            private TrafficLamp(int time){this.time = time;}
        }

     经过编译后,会自动生成子类的 .class文件

    枚举只有一个成员时,就可以作为一种单例的实现方式。

    如果要写一个单例,就可以写一个枚举,只有一个元素。

  • 相关阅读:
    Devrama Slider
    全栈开发必备的10款 Sublime Text 插件
    经典网页设计:使用颜色滤镜效果的20个网站
    Nibbler – 免费的网站测试和指标评分工具
    使用 HTML5 Canvas 绘制出惊艳的水滴效果
    Qt4 和 Qt5 模块的分类
    设计Qt风格的C++API
    Qt属性系统
    Qt实现艺术字效果
    Qt中容器类应该如何存储对象(最好使用对象指针类型,如:QList<TestObj*>,而不要使用 QList<TestObj> 这样的定义,建议采用 智能指针QSharedPointer)
  • 原文地址:https://www.cnblogs.com/wq3435/p/6139748.html
Copyright © 2011-2022 走看看