您的位置:首页 > 编程语言 > Java开发

JavaSE第六十讲 EnumSet与EnumMap详解

2012-12-30 14:20 260 查看
1. EnumSet在实际开发中用的很少,这边延续上一讲内容继续:

程序一:

package com.ahuier.jdk5;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;

public class EnumSetDemo3 {

public static void main(String[] args) {
List<FontConstant> list = new ArrayList<FontConstant>();
list.add(FontConstant.Blod); //这边枚举也是可以放在集合里面的。
list.add(FontConstant.Italilc);
list.add(FontConstant.Plain);

showEnumSet(EnumSet.copyOf(list));//将集合中的元素拷贝到枚举集合中去。
}

public static void showEnumSet(EnumSet<FontConstant> enumSet){
/*
* enumSet 继承了集合,便继承了Iterator()方法
*/
for(Iterator<FontConstant> iter = enumSet.iterator(); iter.hasNext();){
System.out.println(iter.next());
}
}
}
编译执行结果:

Plain

Blod

Italilc

查看JDK Doc文档中的copyOf()方法

copyOf

public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) [这边类型是Collection,所以List 对象是可以作为参数传递进去的]

    Creates an enum set initialized from the specified collection. If the specified collection is an EnumSet instance, this static factory method behaves identically to copyOf(EnumSet). Otherwise, the specified collection must contain at least one element (in
order to determine the new enum set's element type).

[创建一个枚举集合,最初是由指定的集合来初始化,也就是说由集合中的对象来初始化枚举集合中的内容]

2.EnumMap

查看JDK Doc文档中的EnumMap
java.util

Class EnumMap<K extends Enum<K>,V>

java.lang.Object

  java.util.AbstractMap<K,V>

      java.util.EnumMap<K,V>

[这边EnumMap集合中key是需要定义为枚举类型]

package com.ahuier.jdk5;

import java.util.EnumMap;
import java.util.Map;

public class EnumMapDemo {
public static void main(String[] args) {
/*
* 这边查看JDK 文档,EnumMap的构造方法没有不带参数的构造方法,这边使用的构造方法是带键类型的构造方法。
*/
Map<Action, String> map = new EnumMap<Action, String>(Action.class);
map.put(Action.SHOOT, "射击");
map.put(Action.TRUN_LEFT, "向左转");
map.put(Action.TURN_RIGHT, "向右转");
for(Action action : Action.values()){
System.out.println(map.get(action));
}

}
}

enum Action{
TRUN_LEFT, TURN_RIGHT, SHOOT;
}
编译执行结果:

向左转

向右转

射击

【说明】:这边输出的顺序是按Action定义枚举的顺序来排的,而非put进去的顺序。

3. 现在讲解一下枚举在实际开发中应该如何使用,或者它的使用场合。在前面几讲程序中有提到,Java中常量的命名规则,例如之前的相应程序如下:

程序一:

public class Authorization
{
public static final int MANAGER = 1;

public static final int DEPARTMENT = 2;

public static final int EMPLOYEE = 3;
}


程序二:

public class Test
{
public boolean canAccess(int access)
{
if(access == Authorization.MANAGER)
{
return true; //经理访问权限
}
if(access == Authorization.DEPARTMENT)
{
return false; //部门经理访问权限
}
if(access == Authorization.EMPLOYEE)
{
return false; //普通员工访问权限
}

return false;
}
}


【说明】:上面的这个程序这种命名写法一般在JDK1.4中采用,这种方式有一个不好的地方就是在方法canAccess(int access)中,可以传任意的整形值,而实际业务中我们应该传的只能是1,2,3三个整型值,这就是有点不符合我们的业务逻辑。从JDK1.5开始引入了这样枚举之后,最好是使用枚举来实现上面的功能。利用枚举我们就可以实现,只能传递枚举指定的几个对象的。

package com.ahuier.jdk5;

/*
* 定义一个接受枚举类型的控制类
*/

public class AccessControl {

//checkRight()方法中参数类型定义为枚举类型之后,就只能传递枚举中定义的值了,马上缩小了范围
public static boolean checkRight(AccessRight access){
if(access == AccessRight.MANAGER){
return true;
}
else if(access == AccessRight.DEPARTMENT){
return true;
}
return false;

}
public static void main(String[] args) {
/*
* 判断经理是否有权限
* 通过传递一个MANAGER的字符串,这个字符串通过valuesOf()方法自动将其转为Manager的枚举值。
* 注意这边的字符串MANAGER一定要和AccessRight枚举中的相应的枚举值一样
*/
AccessRight accessRight = AccessRight.valueOf("MANAGER");
System.out.println(checkRight(accessRight));
}
}
编译执行结果:

true

4. JDK5.0中的另外一个新特性:静态导入(Static import)。JDK 5.0中引入的新特性中比较复杂的是:泛型,枚举,还有多线程里面的内容。

a) import static com.shengsiyuan.common.Common.Age; 

b) import static com.shengsiyuan.common.Common.output; 

    表示导入 Common 类中的静态成员变量 AGE
以及静态方法 output。注意:使用 import static 时,要一直导入到类中的静态成员变量或静态方法。
不过,过度使用这个特性也会一定程度上降低代码的可读性

在包com.ahuier.common底下定义一个类Common

package com.ahuier.common;

public class Common {
public static final int AGE = 10;
public static final void output(){
System.out.println("Hello world");
}
}
在包Com.ahuier.jdk5底下定义一个类
package com.ahuier.jdk5;

//import com.ahuier.common.Common;

//使用静态的导入定义的静态属性和静态方法,这边必须一直导入到定义静态的属性和方法为止。
import static com.ahuier.common.Common.AGE;
import static com.ahuier.common.Common.output;

public class StaticImportTest {
public static void main(String[] args) {

/* 以前使用static属性的方式
int a = Common.AGE;
System.out.println(a);
Common.output();*/
int a = AGE;
System.out.println(a);
output();
}
}编译执行结果:
10

Hello world
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: