java基础篇2之枚举

1、为什么要有枚举

  问题:要定义星期几或者性别的变量,该怎么定义?
  假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;
  枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错,
  枚举可以让编译器在编译时就可以控制源程序中填写的非法制,普通变量的方式在开发阶段无法实现这一目标

2、用普通类如何实现枚举功能,定义一个WeekDay的类来模拟枚举功能
  - 私有的构造方法
  - 每个元素分别用一个公有的静态成员变量表示
  - 可以有弱冠公有方法或者抽象方法,例如,要提供nextDay方法必须使抽象的
  采用抽象方法定义nextDay就将大量的if else语句庄毅成一个个独立的类。

public 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;
        }
    };

    public abstract WeekDay nextDay();

    /*public WeekDay nextDay(){
        if(this == SUN){
            return MON;
        }else{
            return SUN;
        }
    }*/

    public String toString(){
        return this ==SUN?"SUN":"MON";
    }
}

public class EnumTest{
    WeekDay weekday = WeekDay.SUN;
    System.out.println(weekday.toString());
    System.out.println(weekday.nextDay());
}

3、枚举的基本应用

  扩展:枚举类的values,valueOf,name,toString,ordinal方法

  总结:枚举是一种特殊的类,其中每个元素都是该类的一个实例对象,例如 调用WeekDay.SUN.getClass().getName

public class EnumTest{

        public static void main(String[] args){
            WeekDay weekday2 = WeekDay.FRI;
            System.out.println(weekday2);
            WeekDay.valueOf("SUN").toString();
            WeekDay.values().length;
        }

        public enum WeekDay{
            SUN,MON,TUE,WED,THI,FRI,SAT
        }
    }

4、带有构造方法的枚举

public class EnumTest{
        public static void main(String[] args){
            WeekDay weekday2 = WeekDay.FRI;
            System.out.println(weekday2);
            WeekDay.valueOf("SUN").toString();
            WeekDay.values().length;
        }

        public enum WeekDay{
            SUN(1),MON,TUE,WED,THI,FRI,SAT;
            //放在参数列表之后
            private WeekDay(){...};
            private WeekDay(int day){...};
        }
    }

5、带有抽象方法的枚举

  

      //子类实现父类的抽象方法
        public enum TrafficLamp(){
            RED(30){
                public  TrafficLamp nextLamp(){
                    return GREEN;
                }
            },
            GREEN(45){
                public  TrafficLamp nextLamp(){
                    return YELLOW;
                }
            },
            YELLOW(5){
                public  TrafficLamp nextLamp(){
                    return RED;
                }
            };
            public abstract TrafficLamp nextLamp();
            private int time;
            private TrafficLamp(int time){
                this.time = time;
            }
        }

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

原文地址:https://www.cnblogs.com/atomicbomb/p/6618690.html