Java基础 之 枚举类型

枚举类型的常见使用场景:
枚举类型 作为 错误码集合:
定义的枚举 属性都是 枚举类型,
这个枚举类型每一个错误
会对应一个错误信息;

使用 枚举类型enum 构建一个状态机:
利用enum可以为枚举实例添加方法的特性,
可以构造状态机。

package enumeration ;publicclass Person {
//自己有一个状态
private State s ;
publicPerson( State s ){this. s = s ;}
//调用相应状态下的方法
publicvoidsmile(){
s . smile ();
};
publicvoidcry(){
s . cry ();
};} //状态 enum State {
//高兴状态下的方法实现
Happy {
@Override
publicvoidsmile(){
System . out . println ( "Happy Smile" );
}
@Override
publicvoidcry(){
System . out . println ( "Happy cry" );
}
},
//悲伤状态下的方法实现
Sad {
@Override
publicvoidsmile(){
System . out . println ( "Sad Smile" );
}
@Override
publicvoidcry(){
System . out . println ( "Happy cry" );
}
};
//需要实现的方法
publicabstractvoidsmile();
publicabstractvoidcry();}

使用 枚举类型enum 构建一个职责链:
利用enum可以为枚举实例添加方法的特性,可以构造简单的责任链 。 人在高兴,悲伤状态下的笑和哭具有不同的意义。
package enumeration;public class StringHandler {
enum handler {
Sensitive {
@Override
String hand(String msg) {
return msg.replace("敏感", "*");
}
},
HTML {
@Override
String hand(String msg) {
return msg.replace("<", "[").replace(">", "]");
}
};
//枚举实例须实现此方法
abstract String hand(String msg);
}
//遍历枚举实例处理字符串
public static String hand(String msg) {
for (handler h : handler.values()) {
msg = h.hand(msg);
}
return msg;
}
public static void main(String[] args) {
String msg = "敏感字符,<html>";
System.out.println(StringHandler.hand(msg));
}}
enum 的多路并发:
也就是使用 switch。

查看enum 字节码:
类:
编译出来的类似字节码Oolong语言:
.source EnumTest.java.class public final super EnumTest.super java/lang/Enum.field public static final START LEnumTest;.field public static final CLOSE LEnumTest;.field public static final PAUSE LEnumTest;.field private static final $VALUES [LEnumTest;.method public static values ()[LEnumTest;.limit stack 1.limit locals 0.line 1l0: getstatic EnumTest/$VALUES [LEnumTest;l3: invokevirtual [LEnumTest;/clone ()Ljava/lang/Object;l6: checkcast [LEnumTest;l9: areturn.end method.method public static valueOf (Ljava/lang/String;)LEnumTest;.limit stack 2.limit locals 1.line 1l0: ldc_wl3: aload_0l4: invokestatic java/lang/Enum/valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;l7: checkcast EnumTestl10: areturn.end method.method private <init> (Ljava/lang/String;I)V.limit stack 3.limit locals 3.line 1l0: aload_0l1: aload_1l2: iload_2l3: invokespecial java/lang/Enum/<init> (Ljava/lang/String;I)Vl6: return.end method.method static <clinit> ()V.limit stack 4.limit locals 0.line 2l0: new EnumTestl3: dupl4: ldc "START"l6: iconst_0l7: invokespecial EnumTest/<init> (Ljava/lang/String;I)Vl10: putstatic EnumTest/START LEnumTest;l13: new EnumTestl16: dupl17: ldc "CLOSE"l19: iconst_1l20: invokespecial EnumTest/<init> (Ljava/lang/String;I)Vl23: putstatic EnumTest/CLOSE LEnumTest;l26: new EnumTestl29: dupl30: ldc "PAUSE"l32: iconst_2l33: invokespecial EnumTest/<init> (Ljava/lang/String;I)Vl36: putstatic EnumTest/PAUSE LEnumTest;.line 1l39: iconst_3l40: anewarray EnumTestl43: dupl44: iconst_0l45: getstatic EnumTest/START LEnumTest;l48: aastorel49: dupl50: iconst_1l51: getstatic EnumTest/CLOSE LEnumTest;l54: aastorel55: dupl56: iconst_2l57: getstatic EnumTest/PAUSE LEnumTest;l60: aastorel61: putstatic EnumTest/$VALUES [LEnumTest;l64: return.end method
从类似字节码可以看出,enum被编译为了 常量类,而且父类是Enum,所以enum定义的类不能在继承其它父类,也不能被其它类集成。 枚举类型的field都是 public static final 静态常量类型;
初始化属性时会现调用私有的父类(enum)构造器,然后初始化自己的所有field。 构造器只是在构造枚举值的时候被调用。

更多文章请关注订yue号:java_xuetang

猜你喜欢

转载自blog.csdn.net/bryans/article/details/80830383