Java 枚举
--------
枚举的作用
所谓枚举就是规定好了指定的取值范围,所有的内容只能从指定的范围中取得。
使用简单类完成颜色的取值问题:
class Color{
publicstatic final Color RED = new Color("红色") ; // 定义第一个对象
publicstatic final Color GREEN = new Color("绿色") ; // 定义第一个对象
publicstatic final Color BLUE = new Color("蓝色") ; // 定义第一个对象
privateString name ;
privateColor(String name){
this.name= name ;
}
publicvoid setName(String name){
this.name= name ;
}
publicString getName(){
returnthis.name ;
}
publicstatic Color getInstance(int i){
switch(i){
case1:{
returnRED ;
}
case2:{
returnGREEN ;
}
case3:{
returnBLUE ;
}default:{
returnnull ;
}
}
}
};
public class ColorDemo01{
publicstatic void main(String args[]){
Colorc1 = Color.RED ; // 取得红色
System.out.println(c1.getName()); // 输出名字
Colorc2 = Color.getInstance(3) ; // 根据编号取得名字
System.out.println(c2.getName());
}
};
此时,程序限定了所能取的对象范围,所以达到了枚举的功能,以上是一种枚举的方式。
定义一个枚举类型
在JDK1.5之后,引入了一个新的关键字类型——enum,可以直接定义枚举类型,格式如下:
[public] enum 枚举类型名称{
枚举对象1、枚举对象2……枚举对象n;
}
使用枚举定义三个颜色:
public enum Color{
RED,GREEN,BLUE; // 定义三个枚举的类型
};
以后在取得值的时候,只能从这三个内容中取:
public class GetEnumContent{
publicstatic void main(String args[]){
Colorc = Color.BLUE ; // 取出蓝色
System.out.println(c);
}
};
因为枚举已经指定好了范围,所以可以使用foreach进行全部的输出,使用“枚举.values()”的形式取得全部的枚举内容:
public class PrintEnum{
publicstatic void main(String args[]){
for(Colorc:Color.values()){ // 输出枚举中的全部内容
System.out.println(c);
}
}
};
还可以直接将内容在SWITCH语名上使用:
public class SwitchPrintEnum{
publicstatic void main(String args[]){
for(Colorc:Color.values()){ // 输出枚举中的全部内容
print(c);
}
}
publicstatic void print(Color color){
switch(color){
caseRED:{
System.out.println("红颜色") ;
break;
}
caseGREEN:{
System.out.println("绿颜色") ;
break;
}
caseBLUE:{
System.out.println("蓝颜色") ;
break;
}
default:{
System.out.println("未知颜色") ;
break;
}
}
}
};
Enum类与enum关键字
使用enum关键字可以定义一个枚举,实际上此关键字表示的是java.lang.Enum类型,即:使用enum声明的枚举类型,就相当于定义一个类,而此类则默认继承java.lang.Enum类。
此类定义的时候使用了泛型机制,而且实现了Comparable接口及Serializable接口,证明此类型是可以比较,并可以被序列化的。
实例:使用构造方法传递参数
enum Color{
RED("红色"),GREEN("绿色"),BLUE("兰色") ;
privateColor(String name){
this.setName(name);
}
privateString name ; // 定义name属性
publicvoid setName(String name){
this.name= name ;
}
publicString getName(){
returnthis.name ;
}
}
public class ConstructorEnum{
publicstatic void main(String args[]){
for(Colorc:Color.values()){
System.out.println(c.ordinal()+ " --> " + c.name()
+"(" + c.getName() +")") ;
}
}
};
实例:利用setter()方法设置内容
enum Color{
RED,GREEN,BLUE;
privateString name ; // 定义name属性
publicvoid setName(String name){
switch(this){ // 判断操作的是那个枚举对象
caseRED:{
if("红色".equals(name)){
this.name= name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break;
}
caseGREEN:{
if("绿色".equals(name)){
this.name= name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break;
}
caseBLUE:{
if("蓝色".equals(name)){
this.name= name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break;
}
}
this.name= name ;
}
publicString getName(){
returnthis.name ;
}
}
public class SetEnum{
publicstatic void main(String args[]){
Colorc = Color.BLUE ; // 得到兰色
c.setName("兰色") ; // 名字错误
c.setName("蓝色") ; // 名字正确
System.out.println(c.getName());
}
};
实例:在枚举中实现排序
import java.util.Iterator;
import java.util.Set ;
import java.util.TreeSet ;
enum Color{
RED,GREEN,BLUE;
}
public class ComparableEnum{
publicstatic void main(String args[]){
Set<Color>t = new TreeSet<Color>() ; // 设置类型
t.add(Color.GREEN); // 加入绿色
t.add(Color.RED); // 加入红色
t.add(Color.BLUE); // 加入蓝色
Iterator<Color>iter = t.iterator() ;
while(iter.hasNext()){
System.out.print(iter.next()+ "、") ;
}
}
};
类集对Enum的技持
EnumMap类 实现范例
import java.util.EnumMap ;
import java.util.Map ;
enum Color{
RED, GREEN , BLUE ;
}
public class EnumMapDemo{
publicstatic void main(String args[]){
Map<Color,String>desc = null ; // 定义Map对象,同时指定类型
desc= new EnumMap<Color,String>(Color.class) ; // 实例化EnumMap对象
desc.put(Color.RED,"红色") ;
desc.put(Color.GREEN,"绿色") ;
desc.put(Color.BLUE,"蓝色") ;
System.out.println("======输出全部的内容======") ;
for(Colorc:Color.values()){
System.out.println(c.name()+ " --> " + desc.get(c)) ;
}
System.out.println("======输出全部的键值======") ;
for(Colorc:desc.keySet()){
System.out.print(c.name()+ "、") ;
}
System.out.println();
System.out.println("======输出全部的内容======") ;
for(Strings:desc.values()){
System.out.print(s+ "、") ;
}
}
};
EnumSet类
EnumSet是Set接口的子类,所以里面的内容是无法重复的,在使用EnumSet的时候是不能直接使用关键字new为其进行实例化的,所以在此类中提供了很多的静态方法。
实例:将全部的集合设置到EnumSet集合中
import java.util.EnumSet ;
enum Color{
RED, GREEN , BLUE ;
}
public class EnumSetDemo01{
publicstatic void main(String args[]){
EnumSet<Color>es = null ; // 声明一个EnumSet对象
System.out.println("========EnumSet.allOf(Color.class) =====") ;
es= EnumSet.allOf(Color.class) ; // 将枚举的全部类型设置到EnumSet对象之中
print(es);
}
publicstatic void print(EnumSet<Color> temp){ //专门的输出操作
for(Colorc:temp){ // 循环输出EnumSet中的内容
System.out.print(c+ "、") ;
}
System.out.println();
}
};
实例:只设置一个内容到集合
import java.util.EnumSet ;
enum Color{
RED, GREEN , BLUE ;
}
public class EnumSetDemo02{
publicstatic void main(String args[]){
EnumSet<Color>es = null ; // 声明一个EnumSet对象
System.out.println("========EnumSet.of(Color.BLUE) =====") ;
es= EnumSet.of(Color.BLUE) ; // 将枚举的全部类型设置到EnumSet对象之中
print(es);
}
publicstatic void print(EnumSet<Color> temp){ //专门的输出操作
for(Colorc:temp){ // 循环输出EnumSet中的内容
System.out.print(c+ "、") ;
}
System.out.println();
}
};
实例:拷贝集合内容
import java.util.EnumSet ;
enum Color{
RED, GREEN , BLUE ;
}
public class EnumSetDemo05{
publicstatic void main(String args[]){
EnumSet<Color>esOld = null ; // 声明一个EnumSet对象
EnumSet<Color>esNew = null ;
System.out.println("========EnumSet.copyOf(Color.class) =====") ;
esOld= EnumSet.noneOf(Color.class) ; // 将枚举的全部类型设置到EnumSet对象之中
esOld.add(Color.RED) ; // 增加内容
esOld.add(Color.GREEN); // 增加内容
esNew= EnumSet.copyOf(esOld) ; // 从已有的集合拷贝过来
print(esNew);
}
publicstatic void print(EnumSet<Color> temp){ //专门的输出操作
for(Colorc:temp){ // 循环输出EnumSet中的内容
System.out.print(c+ "、") ;
}
System.out.println();
}
};
枚举的其他应用
枚举类型可以跟普通的类一样实现一个接口,但是实现接品的时候要求枚举中的每一个对象都必须单独覆写接口中的抽象方法:
enum Color implements Print{
RED{
publicString getColor(){
return"红色" ;
}
},GREEN{
publicString getColor(){
return"绿色" ;
}
},BLUE{
publicString getColor(){
return"蓝色" ;
}
};
publicabstract String getColor() ;
}
public class AbstractMethodEnum{
publicstatic void main(String args[]){
for(Colorc:Color.values()){
System.out.print(c.getColor()+ "、") ;
}
}
};
还可以直接在枚举中定义抽象方法,但是要求枚举中的每个对象都分别实现此抽象方法:
interface Print{
publicString getColor() ;
}
enum Color implements Print{
RED{
publicString getColor(){
return"红色" ;
}
},GREEN{
publicString getColor(){
return"绿色" ;
}
},BLUE{
publicString getColor(){
return"蓝色" ;
}
};
}
public class InterfaceEnumDemo{
publicstatic void main(String args[]){
for(Colorc:Color.values()){
System.out.print(c.getColor()+ "、") ;
}
}
};