zoukankan      html  css  js  c++  java
  • 二十五、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();

        }

    }

  • 相关阅读:
    [编]在Web站点中创建和使用Rss源
    Command 模式 Step by Step
    正则表达式 教程
    (转)mysql处理高并发,防止库存超卖
    【转】Golang- import 导入包的几种方式:点,别名与下划线
    win10 c++ build tools的安装
    Reporting Services VS designer 的一个 bug
    使用 AppDomain 让不支持线程安全的代码轻松支持线程安全
    应该怎样设计和开发软件
    Razor 也可说是一个模板引擎,用不着学习 T4 了
  • 原文地址:https://www.cnblogs.com/yueyazhishang/p/4061949.html
Copyright © 2011-2022 走看看