枚举类型的常见使用场景:
枚举类型 作为 错误码集合:
![](https://i-blog.csdnimg.cn/blog_migrate/380882d6d2370a366b7028e31b51c11b.jpeg)
定义的枚举 属性都是 枚举类型,
这个枚举类型每一个错误
会对应一个错误信息;
使用 枚举类型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 字节码:
类:
![](https://i-blog.csdnimg.cn/blog_migrate/95379bffeaf93f050e8e9543c16c35c9.png)
编译出来的类似字节码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。