JavaSE第六十讲 EnumSet与EnumMap详解
2012-12-30 14:20
260 查看
1. EnumSet在实际开发中用的很少,这边延续上一讲内容继续:
程序一:
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是需要定义为枚举类型]
向左转
向右转
射击
【说明】:这边输出的顺序是按Action定义枚举的顺序来排的,而非put进去的顺序。
3. 现在讲解一下枚举在实际开发中应该如何使用,或者它的使用场合。在前面几讲程序中有提到,Java中常量的命名规则,例如之前的相应程序如下:
程序一:
程序二:
【说明】:上面的这个程序这种命名写法一般在JDK1.4中采用,这种方式有一个不好的地方就是在方法canAccess(int access)中,可以传任意的整形值,而实际业务中我们应该传的只能是1,2,3三个整型值,这就是有点不符合我们的业务逻辑。从JDK1.5开始引入了这样枚举之后,最好是使用枚举来实现上面的功能。利用枚举我们就可以实现,只能传递枚举指定的几个对象的。
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
程序一:
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
相关文章推荐
- Java Enum、EnumMap、EnumSet 详解
- 枚举详解 自定义方法 EnumSet,EnumMap 的应用
- JavaSE_反射机制之Field的方法详解
- JavaSE第四十八讲:Map深入详解及遍历Map的两种实现手段
- JavaSE第九十二讲:数据流深入详解
- JavaSE第三十九讲:深入详解ArrayList
- 学习笔记之JavaSE(33)--JavaAPI详解8
- 熟练使用java的Enum、EnumSet、EnumMap
- java集合-EnumMap与EnumSet
- 黑马程序员-javaSE学习之面向对象细节以及重点详解
- JavaSE第六十九讲:Java Annotation详解
- JavaSE第十五讲:方法参数传递详解
- Java中EnumMap代替序数索引代码详解
- JavaSE第七十三讲:异常详解
- JavaSE第八十四讲:Observable类与Observer接口详解,深入理解观察者模式
- JavaSE_86_Math类详解
- 【干货】用大白话聊聊JavaSE — ArrayList 深入剖析和Java基础知识详解(一)
- JavaSE学习 第十八章 JDBC编程[详解]
- JDK5.0新特性:枚举类型enum、枚举集合EnumSet、枚举映射EnumMap
- JavaSE第七十八讲:AWT深入详解