→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

<JDK1.5新特性>:5.枚举集合-EnumSet和EnumMap-

一、EnumSet介绍


EnumSet的名称说明了其作用,他是在J2SE 5.0后加入的新类别,可以协助建立枚举值的集合

,他提供一系列静态方法,可以让您指定不同的集合建立方式。

在实际开发中常用的集合类使用较多,枚举类型的Set使用的场合并不是很多。

EnumSet是一个泛型,他接受接受枚举类型的对象作为其内部的成员。

 

由枚举类型本身特点决定EnumSet和普通集合类的初始化方式是不一样的,普通集合类的初始化

方式如下:

List<E> list = new ArrayList<E>;

但是EnumSet初始化方式不能按照上述new方式写出来。并且我们不能像这个List一样去随意的

想集合中添加特定类型的对象。

这是因为枚举类型的特征所决定的。枚举类型的对象是固定的,我们声明了几个成员,就在编译期

生成了几个枚举类型的实例对象,我们并不能随意的去创建实例对象。

五十九-43:20

 

二、EnumSet  API 五十九-42:30


1.EnumSet<E> of(E e, E... e1)

静态方法,由指定的枚举类型构造EnumSet,该方法返回构造好的EnumSet对象。

五十九-43:40

例如:

package cn.edu.bupt.enumeration;

import java.util.EnumSet;
import java.util.Iterator;

public class EnumSetDemo {

//内部枚举类
private enum FontConstant {
Plain, Bold, Italic;
}

private static void showEnumSet(EnumSet<FontConstant> enumSet) {
for(Iterator<FontConstant> itr = enumSet.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}
}

public static void main(String[] args) {
EnumSet<FontConstant> enumSet = EnumSet.of(FontConstant.Plain); //通过FontConstant枚举类型对象Plain初始化EnumSet,具体可参见JDK
for(FontConstant fc : FontConstant.values()) {
enumSet.add(fc);
}

showEnumSet(enumSet);
}
}

 

2.EnumSet<E> complementOf(EnumSet<E> s)

静态方法,返回指定EnumSet的补集,其补集也是一个EnumSet

五十九-46:00

package cn.edu.bupt.enumeration;

import java.util.EnumSet;
import java.util.Iterator;

public class EnumSetDemo {

//内部枚举类
private enum FontConstant {
Plain, Bold, Italic;
}

private static void showEnumSet(EnumSet<FontConstant> enumSet) {
for(Iterator<FontConstant> itr = enumSet.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}
}

public static void main(String[] args) {
EnumSet<FontConstant> enumSet = EnumSet.of(FontConstant.Plain); //通过FontConstant枚举类型对象Plain初始化EnumSet,具体可参见JDK

showEnumSet(enumSet);
System.out.println("-----------------");
showEnumSet(EnumSet.complementOf(enumSet)); //返回指定集合的补集,因为全集是FontConstant的成员
}
}

 

3.EnumSet<E> noneOf(Class<E> elementType)

静态方法,使用指定的枚举类型创建一个空的集合

五十九-48:50

package cn.edu.bupt.enumeration;

import java.util.EnumSet;
import java.util.Iterator;

public class EnumSetDemo {

//内部枚举类
private enum FontConstant {
Plain, Bold, Italic;
}

private static void showEnumSet(EnumSet<FontConstant> enumSet) {
for(Iterator<FontConstant> itr = enumSet.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}
}

public static void main(String[] args) {
EnumSet<FontConstant> enumSet = EnumSet.noneOf(FontConstant.class); //创建一个空的集合,但是其内部的数据类型是FontConstant枚举类型
for(FontConstant fc : FontConstant.values()) {
enumSet.add(fc);
}

showEnumSet(enumSet);
}
}

 

4.EnumSet<E> copyOf(Collection<E> s)

静态方法,将放入Collection中的枚举类型实例对象转换成为EnumSet类型,并加以返回。

六十-1:00

package cn.edu.bupt.enumeration;

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

public class EnumSetDemo {

//内部枚举类
private enum FontConstant {
Plain, Bold, Italic;
}

private static void showEnumSet(EnumSet<FontConstant> enumSet) {
for(Iterator<FontConstant> itr = enumSet.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}
}

public static void main(String[] args) {
List<FontConstant> list = new ArrayList<FontConstant>();

for(FontConstant fc : FontConstant.values()) {
list.add(fc);
}
EnumSet<FontConstant> enumSet = EnumSet.copyOf(list);

showEnumSet(enumSet);
}
}

 

三、EnumMap介绍


EnumMap与普通的Map很相似,包括其用法,唯一不同的是作为键的对象是Enum类型,如图:

 

四、EnumMap的使用


1.构造  六十-0:00

package cn.edu.bupt.enumeration;

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

public class EnumMapDemo {

private enum Action {
TURN_LEFT, TURN_RIGHT, SHOOT;
}

/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Action, String> map = new EnumMap<Action, String>(Action.class); //泛型首先需要传递类型参数方可变为类

map.put(Action.valueOf("TURN_LEFT"), "向左转");
map.put(Action.TURN_RIGHT, "向右转");
map.put(Action.valueOf("SHOOT"), "射击");

System.out.println(map);
}


}

 

2.枚举的应用场景

访问权限的判断    六十-8:50

package cn.edu.bupt.enumeration;

public class AccessControl {
private static boolean checkRight(AccessRight ar) { //限制传入的权限参数仅限于枚举类型的三个实例对象中,否则会发生语法错误,符合实际业务逻辑需求
if(ar == AccessRight.MANAGER) {
return true;
}
else if(ar == AccessRight.DEPARTMENT) {
return false;
}
else if(ar == AccessRight.EMPLOYEE) {
return false;
}
return false;
}

public static void main(String[] args) {
AccessRight ar = AccessRight.valueOf(args[0]);
System.out.println(checkRight(ar));
}
}

理解:枚举类型是离散概念的一种结构实现,限制了数据的所在范围,方便编译器的检查。

枚举类型的实例对象的个数在编译时期就已经完全确定了,没有办法在运行时去动态的生成

,因此我们只能使用该类型的有限的几个实例来调用,这就是枚举类型最大的一个特点。

在其余方面(除构造方法的访问权限意外),枚举类型同普通类大致相同,有属性有方法,

可以在外界调用枚举类型内部定义的公有方法等等。 六十-16:30





 

posted on 2012-02-03 14:29  阿童沐  阅读(629)  评论(0)    收藏  举报