二十五、JDK1.5新特性---枚举

        与上篇文章介绍的相同,本文也是介绍jdk 1.5出现的新特性,本文将介绍枚举的相关用法。

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

        所谓的枚举就是规定好了指定的取值范围,所以都得内容只能从指定的范围中取得。使用简单类完成颜色的固定取值问题。也就是说一个类只能产生固定的几个对象。例如:

        package 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;

            Color(String name){

                this.name=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 String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

public class ColorDemo1 {

    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());

    }

   

}

        此时程序限定了所能取的对象的范围,所以达到了枚举的功能,以上是一种枚举的方式,在早期的java开发中没有没有枚举这个概念,所以有时候也可以使用接口表示。

interface Color{

    public static final int RED = 1 ;    // 定义红色

    public static final int GREEN = 2 ;    // 定义绿色

    public static final int BLUE = 3 ;    // 定义蓝色

}

        因为以上的所有取值都是直接使用数字表示的,所以操作的时候会存在一些问题。比如:

public class ColorDemo02{

    public static void main(String args[]){

        System.out.println(Color.RED + Color.GREEN) ;    // 颜色相加

    }

}

        这个操作并不是很明确,所以在jdk 1.5之前如果要实现枚举操作就会比较麻烦。

Enum

    从上文的描述可以清晰的了解到,使用enum关键字可以定义一个枚举,实际上这个关键字是java.lang.Enum类型,即使用enum声明的枚举类型相当于定义了一个类,只是这个类默认继承java.lang.Enum

枚举类的主要操作方法

protected

Enum(String name, int ordinal)
          单独的构造方法

int

compareTo(E o)
          比较此枚举与指定对象的顺序。

boolean

equals(Object other)
          当指定对象等于此枚举常量时,返回 true。

protected  void

finalize()
          枚举类不能有 finalize 方法。

 Class<E>

getDeclaringClass()
          返回与此枚举常量的枚举类型相对应的 Class 对象。

int

hashCode()
          返回枚举常量的哈希码。

 String

name()
          返回此枚举常量的名称,在其枚举声明中对其进行声明。

int

ordinal()
          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

 String

toString()
          返回枚举常量的名称,它包含在声明中。

static

<T extends Enum<T>>
T

valueOf(Class<T> enumType, String name)
          返回带指定名称的指定枚举类型的枚举常量。

 

构造方法介绍

        构造方法中接收两个参数,一个表示枚举的名字,另一个表示枚举的序号(从0开始)

protected     Enum(String name, int ordinal)

 

构造枚举的第一种方式

enum Color{

    RED,GREEN,BLUE;

}

        上面的方法是一种简单的形式,在我们开发中遇到的情况往往比较复杂,比如使用一些文字表述定义枚举对象的信息,这时就需要使用第二种方式了。

enum Color{

    RED("红色"),GREEN("绿色"),BLUE("蓝色");

    private String name;

    private Color(String name){

        this.name=name;

    }

}

如果不想通过构造实现设置内容,二十希望通过setter()方法实现,这时就必须按照以下的方式执行

enum Color {

    RED, GREEN, BLUE;

    private String name;

 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        switch (this) {

        case RED:

            if ("红色".equals(name))

                this.name = name;//允许设置名字

            else

                System.out.println("设置内容错误");

            break;

 

        case GREEN:

            if ("蓝色".equals(name))

                this.name = name;//允许设置名字

            else

                System.out.println("设置内容错误");

            break;

        case BLUE:

            if ("绿色".equals(name))

                this.name = name;//允许设置名字

            else

                System.out.println("设置内容错误");

            break;

        }

 

    }

 

}

集合框架对Enum的支持

EnumMap

类 EnumMap<K extends Enum<K>,V>

java.lang.Object

java.util.AbstractMap<K,V>

java.util.EnumMap<K,V>

所有已实现的接口:

Serializable, Cloneable, Map<K,V>

 

案例示范

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("====输出所有值====");

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

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

        }

    }

}

 

EnumSet

    EnumSet是Set接口的子类,所以里面的元素是无法重复的,在使用EnumSet的时候是不能直接使用关键字new为其进行实例化的,所以在此类中提供了很多的静态方法。

案例示范:

 

enum Color {

    RED, GREEN, BLUE;

}

 

public class EnumSetDemo {

    public static void main(String[] args) {

        demo1();

        demo2();

        demo3();

        demo4();

        demo5();

    }

 

    // 将枚举中的所有元素放到EnumSet

    private static void demo1() {

        EnumSet<Color> es = null;// 声明一个EnumSet集合

        System.out.println("===EnumSet.allOf(Color.class)===");

        es = EnumSet.allOf(Color.class);// 将枚举中的所有元素放到EnumSet

        print(es);

    }

 

    // 只设置一个元素到集合中

    private static void demo2() {

        EnumSet<Color> es = null;// 声明一个EnumSet集合

        System.out.println("===EnumSet.Of(Color.BLUE)===");

        es = EnumSet.of(Color.BLUE);// 为集合添加指定的一个元素

        print(es);// 打印该集合

    }

 

    // 创建只能存放指定枚举类型的集合

    private static void demo3() {

        EnumSet<Color> es = null;// 声明一个EnumSet集合

        System.out.println("===EnumSet.noneOf(Color.class)===");

        es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合

        es.add(Color.BLUE);// 添加元素

        // es.add("我的颜色");编译不通过

        print(es);

 

    }

 

    // 创建不包含指定元素的集合

    private static void demo4() {

        EnumSet<Color> es = null;// 声明一个EnumSet集合

        System.out.println("===EnumSet.complementOf(Color.BLUE)===");

        es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合

        es.add(Color.BLUE);// 添加元素

        es.add(Color.RED);// 添加元素

        EnumSet<Color> esNew = null;

        esNew = EnumSet.complementOf(es);// 新的集合不包含上面指定元素

        print(esNew);

    }

 

    // 拷贝一个集合

    private static void demo5() {

        EnumSet<Color> es = null;// 声明一个EnumSet集合

        System.out.println("===EnumSet.copyOf(Color.BLUE)===");

        es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合

        es.add(Color.BLUE);// 添加元素

        es.add(Color.RED);// 添加元素

        EnumSet<Color> esNew = null;

        esNew = EnumSet.copyOf(es);// 将一个集合拷贝给另一个集合

        print(esNew);// 打印该集合

    }

 

    private static void print(EnumSet<Color> es) {// 专门用来输出的操作

        for (Color c : es) {// 循环输出EnumSet中的内容

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

        }

        System.out.println();

    }

}

posted @ 2014-10-30 10:24  月芽之上  阅读(146)  评论(0编辑  收藏  举报