Java学习笔记—枚举

enum基本用法

1.enum在这样使用时分号不是必须的。

public enum Season{
	SPRING,SUMMER,AUTUMN,WINTER
}

2.enum在使用时,会创建 ordinal() 方法,该方法会标明枚举常量的声明顺序。还会生成 static values() 方法,会按照顺序返回常量值组成的数组:

public static void main(String[] args){
	for(Season s:Season.values()){
		println(s.ordinal()+s);
	}
} 

enum还可以用于switch,通常switch语句只能使用数值。

3.enum可以用于单例模式:

public enum Singleton{
	INSTANCE;
    ...
}

这种方式是实现单例模式的最佳方法

enum中的重写

enum可以看成是一个类,可以对enum中的类进行重写,也可以对其构造方法进行重写。

public enum Operation{
	//mSymbol赋值“+”,apply()重写为求和
	PLUS("+"){double apply(double x,double y){return x+y}},
	MINUS("-"){double apply(double x,double y){return x-y}},
	TIMES("*"){double apply(double x,double y){return x*y}},
	DIVIDE("+"){double apply(double x,double y){return x/y}},
	private final String mSymbol;
	Operation(String symbol){
		mSymbol=symbol;
	}
	@override
	public String toString(){return mSymbol;}
	abstract double apply(double x,double y);
}

这样定义中,对Operation的构造方法和apply()方法都进行了重写,调用的效果为:

Operation.PLUS.apply(3,4);==========>7
Operation.PLUS;=============>"+"

二重分类

当一种分类完成后,枚举类型又可以按另一种分类方式分类时:

enum Day{
	MONDAY(WorkDay.WEEKDAY),
	TUESDAY(WorkDay.WEEKDAY),
	WEDNESDAY(WorkDay.WEEKDAY),
	...
	SUNDAY(WorkDay.WEEKEND);
	private final DayType mDt;
	Day(DayType dt){
		mDt=dt;
	}
	dowhat(){
		mDt.dowhat();
	}
	private enum DayType{
		WEEKDAY{void doWhat(){System.out.println("work")}},
		WEEKEND{void doWhat(){System.out.println("have fun")}};
		abstract void doWhat();
	}
}

由值得到enum

enum MyEnum {
    ENUM_1("A"),
    ENUM_2("B");

    private String name;

    private static final Map<String,MyEnum> ENUM_MAP;

    MyEnum (String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    // Build an immutable map of String name to enum pairs.
    // Any Map impl can be used.

    static {
        Map<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
        for (MyEnum instance : MyEnum.values()) {
            map.put(instance.getName(),instance);
        }
        ENUM_MAP = Collections.unmodifiableMap(map);
    }

    public static MyEnum get (String name) {
        return ENUM_MAP.get(name);
    }
}

版权声明:本文为qq_38237213原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。