JavaSE第六十讲 EnumSet与EnumMap详解

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.ahu ier.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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值