zoukankan      html  css  js  c++  java
  • 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;
                }
            }

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

  • 相关阅读:
    python2的比较函数,cmp
    快速排序
    如果a,b,c为自然数,a+b+c=1000,a方+b方=c方,求出abc可能的组合(python实现)
    python之join
    python之functools partial
    Python 3 iter函数用法简述
    python线程之condition
    python 线程 event
    getattr getattribute setattr hasattr delattr
    Properties类
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/6618690.html
Copyright © 2011-2022 走看看