一、枚举简介
JDK1.5加入了了一个全新类型的“类” ——枚举类型。为此JDK1.5引入了一个新的关键字 enum。
//枚举的定义与使用
package com.bob.test;
public enum Color {
Red, White, Bule; // 编译期间就已经确定Color这个类型有3个对象
public static void main(String[] args) {
Color myColor = Color.White; //使用名称. 的方式访问
System.out.println(myColor);
}
}
·枚举类型还提供了两个有用的 静态方法values() 和 valueOf(). 我们可以很方便的使用他们。
//枚举的定义与使用
package com.bob.test;
public enum Color {
Red, White, Bule; // 定义
public static void main(String[] args) {
Color myColor = Color.White;
System.out.println(myColor);
System.out.println("-------------------");
for(Color color : Color.values()){ //values()返回一个数组
System.out.println(color);
}
}
}
枚举(
Enum
): 我们所定义的每个枚举类型都继承自
java.lang.Enum
类,枚举中的每个成员默认都是
public static final
的。
package com.bob.test;
public class EnumTest {
public static void doOp(OpConstant opConstant){ //将枚举作为方法参数传递
switch(opConstant){
case TURN_LEFT:
System.out.println("左转");
break;
case TURN_RIGHT :
System.out.println("右转");
break;
case SHOOT :
System.out.println("射击");
break;
}
}
public static void main(String[] args) {
doOp(OpConstant.TURN_LEFT); //调用方法,传递枚举类型的值
}
}
enum OpConstant{
TURN_LEFT, TURN_RIGHT, SHOOT;
}
·定义枚举类型时本质上就是在定义一个类别,只不过很多细节有编译器帮您完成了,所以某些程度上,enum 关键字的作用就像是 class 或 Interface。
·当您使用“enum” 定义枚举类型时,实质上您定义出来的类型继承自 java.lang.Enum 类,但枚举本身并不是类。而每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance)(换句话说,当定义了一个枚举后,在编译时刻就能确定该枚举有几个实例,分别是什么。在运行期间我们无法在使用该枚举类型创建新的实例了,这些实例在编译期间就已经完全确确定下来了)。他们都被预设为final, 所以您无法改变他们,他们也是 static 成员, 所以您可以通过类型名称直接使用他们,当然最重要的,他们都是公开的(public)。
package com.bob.generics;
public enum Coin { //枚举本身也是一个类别,只是在编译期间就已经确定下了类别中的对象个数
penny("hello"), nikel("world"), dime("welecom"), quarter("hello world"); //调用枚举的构造
private String value; //每个对象维护自己的成员变量
public String getValue(){ //枚举和类一样也可以定义成员变量和方法
return value;
}
private Coin(String value){ //枚举构造方法必须是私有的,因为编译期间就需要生成对象
this.value = value;
}
public static void main(String[] args) {
Coin coin = Coin.quarter; //因为枚举编译期间就已经确定了有多少实例,所以不能通过new的方式。
System.out.println(coin.getValue());
}
}
二、 EnumSet 集合
package com.bob.generics;
import java.util.EnumSet;
import java.util.Iterator;
enum FontConstant{
Plain, Bold, Italilc;
}
public class EnumSetDemo {
public static void main(String[] args) {
EnumSet<FontConstant> enumSet = EnumSet.of(FontConstant.Bold); //使用枚举值构造集合
showEnumSet(enumSet);
System.out.println("-----------------");
showEnumSet(EnumSet.complementOf(enumSet)); //互补
}
public static void showEnumSet(EnumSet<FontConstant> enumSet){ //传递一个集合
for(Iterator<FontConstant> iter = enumSet.iterator(); iter.hasNext(); ){
System.out.println(iter.next());
}
}
}
三、 EnumMap
package com.bob.generics;
import java.util.EnumMap;
import java.util.Map;
public class EnumMapDemo {
public static void main(String[] args) {
Map<Action, String> map = new EnumMap<Action, String>(Action.class); //必须接受枚举类型的key
map.put(Action.TURN_RIGHT, "向右转");
map.put(Action.TURN_LEFT, "向左转");
map.put(Action.SHOOT, "射击");
for(Action action : Action.values()){
System.out.println(map.get(action)); //按枚举成员变量循序打印
}
}
}
enum Action{
TURN_LEFT, TURN_RIGHT, SHOOT;
}
四、 枚举的实际应用
一般在规定了可接受的参数时可以选择使用枚举。比如可以接受,1,2,3,4,5等这种有限的值时候可以选择使用枚举。
范例:访问权限
package com.bob.generics;
public enum AccessRight {
MANAGER, DEPARTMENT, EMPLOYEE;
}
package com.bob.generics;
public class AccessContorl {
public static boolean checkRight(AccessRight accessRight){
if(accessRight == AccessRight.MANAGER){
return true;
}else if(accessRight == AccessRight.DEPARTMENT){
return false;
}else if(accessRight == AccessRight.EMPLOYEE){
return false;
}
return false;
}
public static void main(String[] args) {
//valueOf()方法会自动将字符串转换成枚举类型,只要字符串的值与枚举类型的成员变量值相同即自动转换
AccessRight accessRight = AccessRight.valueOf("MANAGER");
System.out.println(checkRight(accessRight));
}
}