`

java 枚举Enum

阅读更多

 1. 当你创建一个enum类时,编译器会为你生成一个相关的类,这个类继承自Enum

/**
 * 枚举类默认继承的java.lang.Enum类(编译器控制),所以不能再继承其它类 
 * Enum实现了 Comparable<E>, Serializable 接口
 */
public enum MeiJu {
	MEIJU1, MEIJU2, MEIJU3, MEIJU4
} 

 

public class Test {
	public static void main(String[] args) {
		// 注意这里已经向上转型了哦
		for (Enum<MeiJu> meiju : MeiJu.values()) {

			// ------------------下面都是父类(Enum)提供的方法--------------------

			// 返回枚举常量的序数ordinal,final修饰,不可变,按声明时的顺序
			System.err.println("ordinal():" + meiju.ordinal());
			// 输出:0 、1 、 2、3

			// 返回枚举常量的名称name,final修饰,不可变
			// 跟meiju.toString()返回内容是一样的:都是 return this.name;
			// 不过如果使用toString(),可以对其重写
			System.err.println("name():" + meiju.name());
			// 输出: MEIJU1 、MEIJU2 、MEIJU3、MEIJU4

			// 只能比较同一枚举类下的枚举常量,so 比较的是声明顺序ordinal
			System.err.println("compareTo():" + meiju.compareTo(MeiJu.MEIJU2));
			// 输出 -1 、0 、1、2

			// 返回 return this == MeiJu.MEIJU2;
			System.err.println("equals():" + meiju.equals(MeiJu.MEIJU2));
			// 输出:false true false false

			// 跟这个结果一样meiju.getClass(),没有找到不一样的情况 ??
			System.err.println("getDeclaringClass():" + meiju.getDeclaringClass());
			// 输出:都是 class package.MeiJu

			// 还有一个 hashCode() 它返回的是 super.hashCode();
			// Enum 的 super 就是 Object 了

			// 搞不明白这玩意干什么用
			MeiJu valueOf = Enum.valueOf(meiju.getDeclaringClass(),meiju.name());

			// 其它就没什么了吧。。。。上面蓝色字体略掉了

		}
	}
}

       细心人士,会发现上面的代码中,我并没有给枚举类MeiJu添加方法,而且Enum中也没有values()方法。原因看下面两个图片比较一下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  2. 给枚举定义方法,记得在枚举常量后面加";"

public enum MeiJu {
	//定义每个枚举实例,如果有构造方法,必须通过构造方法初始化定义;
	MEIJU1("husband"),
	MEIJU2("wife"),
	MEIJU3("son"),
	MEIJU4("xiaosan");

	private String property; //属性

	private MeiJu(String property) { //只能在内部使用
		this.property = property;
	}

	@Override
	public String toString() {
		return name() + ":" + property;
	}
	
	public static void main(String[] args) {
		for (MeiJu meiju : MeiJu.values()) {
			System.err.println( meiju.toString());
		}
	}
}

 输出:

 

        MEIJU1:husband
        MEIJU2:wife
        MEIJU3:son
        MEIJU4:xiaosan

 


3. 枚举使用 switch

public class Test {

	public String test(MeiJu meiju) {
		switch (meiju) {
			case MEIJU1 : return meiju.toString();
			case MEIJU2 : return meiju.toString();
			case MEIJU3 : return meiju.toString();
			case MEIJU4 : return meiju.toString();
			default :return "";
		}

	}

	public static void main(String[] args) {
		Test t = new Test();
		System.err.println(t.test(MeiJu.MEIJU4));
	}
}

 输出:MEIJU4:xiaosan

 

 

4. Class还给枚举类弄了个专属武器getEnumConstants(),所以即使在enum被向上转型也能得到其所有实例。

public class Test {

	public void test(Enum<?> meiju) {
		// 注意:Enum是没有 meiju.values() 方法的。
		// 不过Class中有方法getEnumConstants()可以得到枚举所有实例
		for (Enum<?> en : meiju.getClass().getEnumConstants()) {
			System.err.println(en.toString());// 覆盖后的toString
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		t.test(MeiJu.MEIJU4);
	}
}
public class Test {
	// 上面方法的扩展
	public <E extends Enum<E>> void test(Class<E> meiju) {
		// 泛型 参考上一篇 java泛型
		for (E en : meiju.getEnumConstants()) {
			System.err.println(en.toString());
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		t.test(MeiJu.MEIJU4.getDeclaringClass());
		// t.test(MeiJu.MEIJU4.getClass()); //这样就不行了
		t.test((Class) MeiJu.MEIJU4.getClass());// 这样可以,但是一堆警告
	}
}
  

  输出:

       MEIJU1:husband
       MEIJU2:wife
       MEIJU3:son
       MEIJU4:xiaosan

 

 

5. 通过枚举管理枚举 

public enum MeiJu {
	;//注意这里有个";"

	enum MeiJu1 {A, B, C}

	enum MeiJu2 {D, E, F}

	public static void main(String[] args) {
		for (MeiJu1 meiju1 : MeiJu.MeiJu1.values()) {
			System.err.print(meiju1); //输出:ABC
		}
	}
}

 

 

6.EnumSet现在是个抽象类(JavaSE 7),EnumMap不是 ,不行了搞不动了。。这就研究到这了

0
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics