[2014-09-02]JAVA笔记_枚举(Enumeration)

来源:互联网 发布:汉字笔顺演示软件下载 编辑:程序博客网 时间:2024/05/18 22:12

一、枚举简介

        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);}}}

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);//必须接受枚举类型的keymap.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));}}














0 0
原创粉丝点击