Java 數據類型在實際開發中應用二枚舉
在實際編程中,往往存在著這樣的“數據集”,它們的數值在程序中是穩定的,而且“數據集”中的元素是有限的。在JDK1.5之前,人們用接口來描述這一種數據類型。
1.5以後引入枚舉
一:枚舉類基本語法
定義:
創建枚舉類型要使用 enum 關鍵字,如果是想聲明簡單枚舉,屬性之間用逗號相隔 ;如果是屬性帶id,類似(male(1))這種還需要一個帶id的構造方法
簡單枚舉類:
public enum ColorEnum { red, green, yellow, blue; }
枚舉像普通的類一樣可以添加屬性和方法,如下
public enum Gender { MALE(0), // 男 FEMALE(1); // 女 int id; Gender(int id) { this.id = id; } public int getId() { return id; } }
如果不加構造器,直接在 “類型後邊加(1)” 這種形式會報錯,如下:
enum ColorEnum { red(1), green(2), yellow(3), blue(4);//編譯出錯:The constructor ColorEnum(int) is undefined }
因為枚舉類的本質是一個Enum類,所以它可以加一些自定義的方法:比如·上邊的getId()
使用:
可以用來foreach,switch傳入枚舉變量, case 是枚舉內定義的每一個類型。
Gender gender = Gender.women switch (gender) { case male: System.out.println("male"); break; case female: System.out.println("female"); break;
int
compareTo(E o)
比較此枚舉與指定對象的順序。
Class<E>
getDeclaringClass()
返回與此枚舉常量的枚舉類型相對應的 Class 對象。
String
name()
返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。
int
ordinal()
返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數為零)。
String
toString()
返回枚舉常量的名稱,它包含在聲明中。
static
<T extends Enum<T>> T
valueOf(Class<T> enumType, String name)
返回帶指定名稱的指定枚舉類型的枚舉常量。
二:web項目中應用枚舉
@Enumerated private Gender gender;//entity類
我們看一下Gender的配置
ublic enum Gender { MALE(0), // 男 FEMALE(1); // 女 int id; Gender(int id) { this.id = id; } public int getId() { return id; } }
,如果調用的原聲的dao,查詢出來的結果是Map
userVO.setGender(Gender.valueOf((String) map.get("gender")));//如果查詢出來的是Map,則通過 Gender.valueOf(方法得到想要的枚舉
如果是hibernate,則會不需要我們去關系到底查詢出來的是什麽,只需要指導是枚舉類型即可
List<UserVO> userVOList = new ArrayList<UserVO>(); try { String queryString = "select * from User U left join U.institutions INS where INS.institution.id = ‘" + id + "‘ order by U.code"; userList = userDao.query(queryString);//如果是調用hibernate,查詢出來不需要調用valueOf()方法 if (userList != null && userList.size() > 0) { } }
三 :原理分析
參照了java enum(枚舉)使用詳解 + 總結,非常感謝
enum 的語法結構盡管和 class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class文件。該class文件經過反編譯實際上是生成了一個類,該類繼承了java.lang.Enum<E>。所以, enum本質上 java 編譯器幫我們做了語法的解析和編譯的一個普通的類。
唯一的區別,是枚舉隱式繼承了Enum,所以不可以在繼承 ..
EnumTest test = EnumTest.TUE; ... System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName()); //輸出結果是getDeclaringClass(): com.dtsz.enumTest.EnumTest
四:EnumSet,EnumMap 的應用
EnumSet和EnumMap是枚舉的比較重要的用處。他們是操作枚舉對象的工具類。具體的細節推薦去看一下Java 枚舉用法詳解,在這裏,我簡單的總結一下:
EnumSet
是枚舉類型的高性能Set
實現。它要求放入它的枚舉常量必須屬於同一枚舉類型。 EnumMap
是專門為枚舉類型量身定做的Map
實現。雖然使用其它的Map實現(如HashMap)也能完成枚舉類型實例到值得映射,但是使用EnumMap會更加高效:它只能接收同一枚舉類型的實例作為鍵值,並且由於枚舉類型實例的數量相對固定並且有限,所以EnumMap使用數組來存放與枚舉類型對應的值。這使得EnumMap的效率非常高。
/ EnumSet的使用 System.out.println("EnumSet展示"); EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class); for (ErrorCodeEn e : errSet) { System.out.println(e.name() + " : " + e.ordinal()); } // EnumMap的使用 System.out.println("EnumMap展示"); EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class); errMap.put(StateMachine.Signal.RED, "紅燈"); errMap.put(StateMachine.Signal.YELLOW, "黃燈"); errMap.put(StateMachine.Signal.GREEN, "綠燈"); for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) { Map.Entry<StateMachine.Signal, String> entry = iter.next(); System.out.println(entry.getKey().name() + " : " + entry.getValue()); }
Java 數據類型在實際開發中應用二枚舉