枚举

来源:互联网 发布:淘宝需要品牌授权 编辑:程序博客网 时间:2024/06/06 01:48
1、问题:
    一个类型的设计者不仅设计一个类型还要设计这个类型的值,使该类型的使用者使用固定的值。
2、类实现:
    将大量的if else语句,使用抽象方法转移成一个个独立的类。
大量if-else语句
public class practice {
public static void main(String[] args){
        WeekDay wkd = WeekDay.SUN;
        System.out.println(wkd.nextDay());
    }
    
}

class WeekDay{
    private WeekDay(){}
    public static final WeekDay SUN = new WeekDay();
    public static final WeekDay MON = new WeekDay();
    public WeekDay nextDay(){
        if(this == SUN)
            return MON;
        else
            return SUN;
    }
    
    public String toString(){
        return this == SUN?"SUN":"MON";
    }
}


public class practice {
    public static void main(String[] args){
        WeekDay wkd = WeekDay.SUN;
        System.out.println(wkd.nextDay());
    }
    
}
用抽象类将if-else语句转移成一个个独立的类
abstract class  WeekDay{
    private WeekDay(){}
    public static final WeekDay SUN = new WeekDay(){
        public WeekDay nextDay(){
            return MON;
        }
    };
    public static final WeekDay MON = new WeekDay(){
        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";
    }
}
3、语法
(1)基本结构:
public enum WeekDay{
    SUN,MON,TUE;//如果只有这个几个属性,没有构造方法等其他成员,分号可以不写
}

WeekDay wkd = WeekDay.SUN;

(2)一些方法:
System.out.println(wkd);//自动实现了toString()方法
System.out.println(wkd.name())//答案:SUN
System.out.println(wkd.ordinal())//排行第几 答案:1
静态方法: System.out.println(WeekDay.valueOf("SUN"));//把一个串变成一个enum值,生成一个enum对象

(3)构造方法:
        要求所有的构造方法在成员列表之后。
        构造方法的访问属性要求是private的。
public class practice {
public static void main(String[] args){
        WeekDay wkd = WeekDay.SUN;//由于将成员变量看做是静态变量,所以每初始调用一次本类,都会给每个静态成员加载执行一次无参构造
        
        System.out.println(wkd.name());
    }
    
}
//和类是一样的 公共修饰的枚举名字和源文件名字必须相同
enum WeekDay{
    SUN,MON,TUS,WED(1);
    private WeekDay(){System.out.println("无参构造");}
    //调用第二个有参构造的方法 表示创建这个元素的时候,调用哪个构造方法。
    private WeekDay(int day){System.out.println("有参构造");}
}
(4)带有抽象方法
//枚举只有一个成员时,可以作为单例的实现方法
//属性是本类、静态、常量
//构造方法是属性
//newInstance都不需要写
enum TrafficLamp{
    RED(45){//new子类的实际对象
        //调用父类的构造方法
        //RED的引用指向实际的对象
        public  TrafficLamp nextLamp(){
            return GREEN;
        }
    },
    GREEN(40){
        public  TrafficLamp nextLamp(){
            return YELLOW;
        }
    },
    YELLOW(5){
        public  TrafficLamp nextLamp(){
            return RED;
        }
    };
    public abstract TrafficLamp nextLamp();
    private int time;
    private TrafficLamp(){}
    private TrafficLamp(int time){this.time = time;}
}
0 0
原创粉丝点击