#35.Java的Enum
##35.1 Java的枚举实现与特性
- 使用类常量实现枚举会有类型不安全,一致性差等问题; https://www.ibm.com/developerworks/cn/java/j-lo-enum/
- Java的枚举类型是在编译器实现的,枚举类型会被编译成一个
public final并继承Enum的类,所以枚举类型并不能被继承; - 当声明一个
enum,它会隐式地继承java.lang.Enum,同时在编译器会被转化为一个类。再者枚举类型的常量会被转化为一个该类的一个实例常量; - 如果你在类的内部声明一个
enum类型,则该enum默认是static的; - Enumeration constants cannot be cloned. An attempt to do so will result in a
CloneNotSupportedException; - 由于
enum内部是以类的是形式实现的,所以可以在enum的内部想普通的类一样添加成员变量和方法; - 利用
enum的特性可以很容易得实现单例模式; - 利用
enum的特性可以很容易地实现简单的状态机;
源代码
public enum RequestMethod {
GET, POST, PUT, DEDLETE
}编译后反编译的代码:
public final class RequestMethod extends Enum
{
public static final RequestMethod GET;
public static final RequestMethod POST;
public static final RequestMethod PUT;
public static final RequestMethod DEDLETE;
private static final RequestMethod ENUM$VALUES[];
private RequestMethod(String s, int i)
{
super(s, i);
}
public static RequestMethod[] values()
{
RequestMethod arequestmethod[];
int i;
RequestMethod arequestmethod1[];
System.arraycopy(arequestmethod = ENUM$VALUES, 0, arequestmethod1 = new RequestMethod[i = arequestmethod.length], 0, i);
return arequestmethod1;
}
public static RequestMethod valueOf(String s)
{
return (RequestMethod)Enum.valueOf(RequestMethod, s);
}
static
{
GET = new RequestMethod("GET", 0);
POST = new RequestMethod("POST", 1);
PUT = new RequestMethod("PUT", 2);
DEDLETE = new RequestMethod("DEDLETE", 3);
ENUM$VALUES = (new RequestMethod[] {
GET, POST, PUT, DEDLETE
});
}
}##35.2 枚举实现单例
public enum MySingleton {
INSTANCE;
private MySingleton() {
System.out.println("Here");
}
}##35.3 枚举实现简单状态机
public enum State {
Born {
@Override
void process(Object prams) {}
},
Walk {
@Override
void process(Object prams) {}
},
Run {
@Override
void process(Object prams) {}
},
Attack {
@Override
void process(Object prams) {}
};
abstract void process(Object prams);
public static void main(String[] args) {
Player player = new Player();
player.walk();
player.attack();
}
}
class Player {
public State state = State.Born;
public void walk() {
state = State.Walk;
state.process(new Object());
}
public void attack() {
state = State.Attack;
state.process(new Object());
}
}##35.2 Java的枚举与C#枚举的异同
http://stackoverflow.com/questions/469287/c-sharp-vs-java-enum-for-those-new-to-c