java枚舉應用(三)

資料博客參考:  http://blog.csdn.net/w172087242/article/details/51262474


所有包名都被我去掉了,處於無包結構。

接口代碼如下:

public interface Business {
	/**
	 * 執行業務
	 */
	void run();
}


枚舉代碼如下:

import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

/**
 * 枚舉進階篇,單例,反射
 * @author littlehow
 *
 */
public enum BusinessEnum implements Business{
	/**
	 * 買車,最多不能超過40萬元
	 */
	Singleton("奧迪", 400_000);
	/**
	 * 業務名稱
	 */
	private String name;
	/**
	 * 最大存儲,練習業務,無具體效果
	 */
	private int max;
	/**
	 * 初始化時間
	 */
	private long initTime;
	private BusinessEnum(String name, int max) {
		this.name = name;
		this.max = max;
		this.initTime = System.currentTimeMillis();
	}
	/**
	 * 獲取業務名稱
	 * @return
	 */
	public String getName() {
		return name;
	}
	
	/**
	 * 獲取最大錢數
	 * @return
	 */
	public int getMax() {
		return max;
	}
	/**
	 * 獲取初始化時間
	 * @return
	 */
	public long getInitTime() {
		return initTime;
	}

	@Override
	public void run() {
		System.out.println("我想要買一輛["+this.name+"], 預算不超過["+this.max +"]元");
	}
	
	@Override
	public String toString() {
		return this.name;
	}

	/**
	 * 業務調用
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws Exception {
		System.out.println("啓動時間[" + System.currentTimeMillis() + "]");
		TimeUnit.MILLISECONDS.sleep(10);//沉沉的睡去10毫秒吧
		/** 獲取任務 */
		Business business = Singleton;
		TimeUnit.MILLISECONDS.sleep(10);//沉沉的睡去10毫秒吧
		System.out.println("啓動時間[" + System.currentTimeMillis() + "]");
		/** 執行業務 */
		business.run();//我想要買一輛[奧迪], 預算不超過[400000]元
		/** 獲取實例初始時間 
		 *  最後發現在main方法之初,枚舉對象就已經實例化了
		 * */
		System.out.println("實例時間[" + ((BusinessEnum)business).getInitTime() + "]");
		try {
			business = (Business)BusinessEnum.class.newInstance();
		} catch (Exception e) {
			/**
			 * 異常堆棧(因爲枚舉不能被反射實例化):
			 * java.lang.InstantiationException: BusinessEnum
			 *		at java.lang.Class.newInstance(Class.java:364)
			 *		at BusinessEnum.main(BusinessEnum.java:..)
			 */
			e.printStackTrace();
		}
		TimeUnit.SECONDS.sleep(1);//沉沉的睡去一秒吧
		/** 獲取類型 */
		Class<?> clazz = business.getClass();
		/** 輸出類型 */
		System.out.println(clazz);//class BusinessEnum
		/** 獲取其修飾符 */
		int modifiers = clazz.getModifiers();
		System.out.println(modifiers);//16401 
		/** 轉換成二進制輸出 
		 *  從我的另外一篇博客可以知道,枚舉類型都是final的
		 *  http://blog.csdn.net/w172087242/article/details/51262474
		 *  用於修飾枚舉類型的爲 100000000000000=16384 = 0x00004000
		 * */
		System.out.println(Integer.toBinaryString(modifiers));//100000000010001
		/** 判斷是否爲枚舉 */
		System.out.println(clazz.isEnum());//true
		/** 獲取父類  class java.lang.Enum */
		System.out.println(clazz.getSuperclass());
		/** 根據反射實例化枚舉對象 */
		Method valueOf = clazz.getDeclaredMethod("valueOf", String.class);
		/** 輸出public static BusinessEnum BusinessEnum.valueOf(java.lang.String) 
		 *  可以看出是static的
		 * */
		System.out.println(valueOf);
		boolean staticflag = (8 & valueOf.getModifiers()) == 8;
		System.out.println(staticflag);//true
		if (staticflag) {//靜態的纔不需要實例來調用
			BusinessEnum businessNew = (BusinessEnum)valueOf.invoke(null, "Singleton");
			/** 驗證是否爲單例,發現時間與上面的初始化時間一致 */
			System.out.println(businessNew.getInitTime());
			/**
			 * 執行業務
			 * 我想要買一輛[奧迪], 預算不超過[400000]元
			 */
			businessNew.run();
		} else {
			/** 枚舉類型都會有這樣的方法,只能重載,不能覆蓋,所以不用擔心會出現非static的valueOf(String) */
			System.out.println("非靜態的valueOf方法不是目標方法");
		}
	}
}



發佈了55 篇原創文章 · 獲贊 75 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章