枚举类Enum

普通类的实例可以为无数个,枚举类的对象是有限个。所有可以用作单例模式

java 枚举类型enum 的使用

       最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。既然不明白就抽时间研究下吧。

      Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。要了解枚举类型,建议大家先打开jdk 中的Enum 类简单读一下,这个类里面定义了很多protected 方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中。每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入枚举类型的name ,具体可以参考下面的例子。

通常定义常量方法

我们通常利用public final static 方法定义的代码如下,分别用1 表示红灯,3 表示绿灯,2 表示黄灯。

package com.csdn.myEnum;
public class Light {
    /* 红灯 */
    public final static int RED =1;
    /* 绿灯 */
    public final static int GREEN =3;
    /* 黄灯 */
    public final static int YELLOW =2;
}

枚举类型定义常量方法

枚举类型的简单定义方法如下,我们似乎没办法定义每个枚举类型的值。比如我们定义红灯、绿灯和黄灯的代码可能如下:

public enum Light {
     RED , GREEN , YELLOW ;
} 

        我们只能够表示出红灯、绿灯和黄灯,但是具体的值我们没办法表示出来。别急,既然枚举类型提供了构造函数,我们可以通过构造函数和覆写toString 方法来实现。首先给Light 枚举类型增加构造方法,然后每个枚举类型的值通过构造函数传入对应的参数,同时覆写toString 方法,在该方法中返回从构造函数中传入的参数,改造后的代码如下:

public enum Light {

   // 利用构造函数传参
   RED (1), GREEN (3), YELLOW (2);
   // 定义私有变量
   private int nCode ;
   // 构造函数,枚举类型只能为私有
   private Light( int _nCode) {
       this . nCode = _nCode;
   }
   @Override
   public String toString() {
       return String.valueOf ( this . nCode );
   }
}

枚举类型的完整演示代码如下:

public class LightTest {

    // 1. 定义枚举类型
    public enum Light {
       // 利用构造函数传参
       RED (1), GREEN (3), YELLOW (2);

       // 定义私有变量
       private int nCode ;

       // 构造函数,枚举类型只能为私有
       private Light( int _nCode) {
           this . nCode = _nCode;
       }
 
       @Override
       public String toString() {
           return String.valueOf ( this . nCode );
       }
    }


    public static void main(String[] args ) {

       // 1. 遍历枚举类型
       System. out .println( " 演示枚举类型的遍历 ......" );
       testTraversalEnum ();

       // 2. 演示 EnumMap 对象的使用
       System. out .println( " 演示 EnmuMap 对象的使用和遍历 ....." );
       testEnumMap ();

       // 3. 演示 EnmuSet 的使用
       System. out .println( " 演示 EnmuSet 对象的使用和遍历 ....." );
       testEnumSet ();

    }

    private static void testTraversalEnum() {
       Light[] allLight = Light.values ();
       for (Light aLight : allLight) {
           System. out .println( " 当前灯 name : " + aLight.name());
           System. out .println( " 当前灯 ordinal : " + aLight.ordinal());
           System. out .println( " 当前灯: " + aLight);
       }
    }

    private static void testEnumMap() {

       // 1. 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是 key 的类的类型
       EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
              Light. class );
       currEnumMap.put(Light. RED , " 红灯 " );
       currEnumMap.put(Light. GREEN , " 绿灯 " );
       currEnumMap.put(Light. YELLOW , " 黄灯 " );

       // 2. 遍历对象
       for (Light aLight : Light.values ()) {
           System. out .println( "[key=" + aLight.name() + ",value="
                  + currEnumMap.get(aLight) + "]" );
       }
    }


    private static void testEnumSet() {
       EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
       for (Light aLightSetElement : currEnumSet) {
           System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
       }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值