Skip to content

Latest commit

 

History

History
127 lines (102 loc) · 3.1 KB

File metadata and controls

127 lines (102 loc) · 3.1 KB

#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