您的位置:首页 > 职场人生

黑马程序员——JAVA(枚举)

2012-08-14 21:18 274 查看
-------
android培训java培训、期待与您交流!
----------

(一) 枚举的作用

在JDK1.5之前,JAVA可以有两种方式定义新类型:类和接口。对于大部分面向对象编程来说,这两种方法看起来似乎足够了。但是在一些特殊的情况下,这些方法就不合适了。例如,定义一个Color类,它只能有Red,Green,Blue三种值,其他的任何值都是非法的,那么在JDK1.5之前虽然可以构造这样的代码,但是要做很多工作,也有可能带来各种不安全问题,而JDK1.5之后引入的枚举(Enum)就能避免这些问题。

class Color{

public static final Color RED = new Color("红色") ; // 定义第一个对象

public static final Color GREEN = new Color("绿色") ; // 定义第一个对象

public static final Color BLUE = new Color("蓝色") ; // 定义第一个对象

private String name ;

private Color(String name){

this.name = name ;

}

public void setName(String name){

this.name = name ;

}

public String getName(){

return this.name ;

}

public static Color getInstance(int i){

switch(i){

case 1:{

return RED ;

}

case 2:{

return GREEN ;

}

case 3:{

return BLUE ;

}default:{

return null ;

}

}

}

};

public class ColorDemo01{

public static void main(String args[]){

Color c1 = Color.RED ; // 取得红色

System.out.println(c1.getName()) ; // 输出名字

Color c2 = Color.getInstance(3) ; // 根据编号取得名字

System.out.println(c2.getName()) ;

}

};

可是这样的操作不会很明确,所以在JDK1.5之前如果想要实现枚举的操作,则就会比较麻烦。

定义一个枚举:

在JDK1.5后,引入一个新的关键字类型—enum,可以直接定义枚举类型,格式

[public ] enum 枚举类型名称{

枚举对象1,枚举对象2,….,枚举对象n;

}

public enum Color{

RED,GREEN,BLUE ; // 定义三个枚举的类型

};

因为枚举已经指定好了范围,所以可以使用foreach进行全部的输出,使用“枚举,values”的形式取得全部内容。

public class PrintEnum{

public static void main(String args[]){

for(Color c:Color.values()){ // 输出枚举中的全部内容

System.out.println(c) ;

}

}

};

也可以在switch语句上使用.

public class SwitchPrintEnum{

public static void main(String args[]){

for(Color c:Color.values()){ // 输出枚举中的全部内容

print(c) ;

}

}

public static void print(Color color){

switch(color){

case RED:{

System.out.println("红颜色") ;

break ;

}

case GREEN:{

System.out.println("绿颜色") ;

break ;

}

case BLUE:{

System.out.println("蓝颜色") ;

break ;

}

default:{

System.out.println("未知颜色") ;

break ;

}

}

}

};

(二) 枚举类 Enum

使用enum关键字可以定义一个枚举,实际上此关键字表示的是java.lang.Enum类型,也就是使用enum声明的枚举类型,就相当于定义一个类,而此类则默认继承Enum类;

在枚举中实际上已经实现好了Comparable接口,所以枚举的内容是可以排序的。因为每个枚举对象都有默认的编号,枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象

import java.util.Iterator;

import java.util.Set ;

import java.util.TreeSet ;

enum Color{

RED,GREEN,BLUE ;

}

public class ComparableEnum{

public static 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类的定义:

public class EnumMap<K extends Enum<K>,V> extends AbstractMap<K,V> implements Serializable,Cloneable

例如:

import java.util.EnumMap ;

import java.util.Map ;

enum Color{

RED , GREEN , BLUE ;

}

public class EnumMapDemo{

public static 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(Color c:Color.values()){

System.out.println(c.name() + " --> " + desc.get(c)) ;

}

System.out.println("====== 输出全部的键值 ======") ;

for(Color c:desc.keySet()){

System.out.print(c.name() + "、") ;

}

System.out.println() ;

System.out.println("====== 输出全部的内容 ======") ;

for(String s:desc.values()){

System.out.print(s + "、") ;

}

}

};

EnumSet

EnumSet是Set接口的子类,所以里面的内容是无法重复的,在使用EnumSet的时候是不能直接使用关键字new为其进行实例化的,所以在此类种提供了很多的静态方法。EnumSet基本上都是使用静态方法完成的。

(四) 枚举的其他应用

枚举类型可以跟普通类一样实现一个接口,但是实现接口的时候要求枚举中的每个对象都必须单独覆写好接口中的抽象方法

例题:

interface Print{

public String getColor() ;

}

enum Color implements Print{

RED{

public String getColor(){

return "红色" ;

}

},GREEN{

public String getColor(){

return "绿色" ;

}

},BLUE{

public String getColor(){

return "蓝色" ;

}

} ;

}

public class InterfaceEnumDemo{

public static void main(String args[]){

for(Color c:Color.values()){

System.out.print(c.getColor() + "、") ;

}

}

};

枚举中也可以定义抽象方法,但是要求枚举中的每一个对象都分别实现抽象方法。

实例:

enum Color implements Print{

RED{

public String getColor(){

return "红色" ;

}

},GREEN{

public String getColor(){

return "绿色" ;

}

},BLUE{

public String getColor(){

return "蓝色" ;

}

} ;

public abstract String getColor() ;

}

public class AbstractMethodEnum{

public static void main(String args[]){

for(Color c:Color.values()){

System.out.print(c.getColor() + "、") ;

}

}

};

-------
android培训、java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: