`
lxy2330
  • 浏览: 469151 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java枚举类型enum的使用

    博客分类:
  • java
 
阅读更多
 
分类: java 6261人阅读 评论(3) 收藏 举报

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

       }

    }

 

 

三、   完整示例代码

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

 

package com.csdn.myEnum;

 

import java.util.EnumMap;

import java.util.EnumSet;

 

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

       }

    }

 

    /**

      * @param args

      */

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

       }

    }

 

    /**

      * 演示 EnumMap 的使用, EnumMap  HashMap 的使用差不多,只不过 key 要是枚举类

      */

    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) + "]" );

       }

    }

 

    /**

      * 演示 EnumSet 如何使用, EnumSet 是一个抽象类,获取一个类型的枚举类型内容<BR/>

      * 可以使用 allOf 方法

      */

    private static void testEnumSet() {

       EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );

       for (Light aLightSetElement : currEnumSet) {

           System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);

       }

 

    }

}

 

 

 

执行结果如下:

 

演示枚举类型的遍历 ......

当前灯 name  RED

当前灯 ordinal  0

当前灯: 1

当前灯 name  GREEN

当前灯 ordinal  1

当前灯: 3

当前灯 name  YELLOW

当前灯 ordinal  2

当前灯: 2

演示 EnmuMap 对象的使用和遍历 .....

[key=RED,value= 红灯 ]

[key=GREEN,value= 绿灯 ]

[key=YELLOW,value= 黄灯 ]

演示 EnmuSet 对象的使用和遍历 .....

当前 EnumSet 中数据为: 1

当前 EnumSet 中数据为: 3

当前 EnumSet 中数据为: 2

 

 

 

四、   通常定义常量方法和枚举定义常量方法区别

以下内容可能有些无聊,但绝对值得一窥

1.    代码:

public class State {

public static final int ON = 1;

public static final Int OFF= 0;

}

 

有什么不好了,大家都这样用了很长时间了,没什么问题啊。

首先,它不是类型安全的。你必须确保是int

其次,你还要确保它的范围是0 和1

最后,很多时候你打印出来的时候,你只看到 1 

 

但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final 常量吧

 

2.    可以创建一个enum 类,把它看做一个普通的类。除了它不能继承其他类了。(java 是单继承,它已经继承了Enum),

可以添加其他方法,覆盖它本身的方法

3.    switch() 参数可以使用enum 了

 

4.    values() 方法是编译器插入到enum 定义中的static 方法,所以,当你将enum 实例向上转型为父类Enum 是,values() 就不可访问了。解决办法:在Class 中有一个getEnumConstants() 方法,所以即便Enum 接口中没有values() 方法,我们仍然可以通过Class 对象取得所有的enum 实例

 

5.    无法从enum 继承子类,如果需要扩展enum 中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。

 

6.    使用EnumSet 代替标志。enum 要求其成员都是唯一的,但是enum 中不能删除添加元素。

 

7.    EnumMap key 是enum ,value 是任何其他Object 对象。

 

8.    enum 允许程序员为eunm 实例编写方法。所以可以为每个enum 实例赋予各自不同的行为。

 

9.    使用enum 的职责链(Chain of Responsibility) . 这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。

 

10.   使用enum 的状态机

 

11.   使用enum 多路分发

分享到:
评论

相关推荐

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    高阶Java-Java枚举类型 enum 应用详解

    枚举类型可以有自己的构造器,但只能在枚举声明时使用,并且不能是公有的。这允许在创建枚举实例时进行初始化操作。 ```java public enum Planet { MERCURY(3.303e+23, 2.4397e6), VENUS(4.869e+24, 6.0518e6), ...

    Java中的枚举类型Enum示例源代码

    枚举类型还可以与其他集合框架结合使用,例如`EnumSet`和`EnumMap`。`EnumSet`是专为枚举设计的高效集合,而`EnumMap`则是一个以枚举类型为键的映射表。 在枚举类型中,还可以定义抽象方法,所有枚举常量必须实现...

    Java枚举类型enum的详解及使用

    Java 枚举类型 enum 的详解及使用 Java 枚举类型 enum 是 Java 语言中的一种特殊的数据类型,自从 JDK 1.5 引入枚举类型以来,它已经成为了 Java 程序员中的一种常用工具。本文将对 Java 枚举类型 enum 进行详解,...

    Java枚举(enum)类型深度解析:特性、用法与最佳实践

    本文将深入探讨Java枚举类型的特点、用法以及最佳实践。 Java中的枚举类型是一种强大的特性,它提供了一种类型安全的方式来表示一组固定的常量。枚举类型可以包含字段、方法和构造器,使得它们可以携带额外的信息和...

    全面掌握java枚举类型(enum-type)1

    Java 中使用关键字 enum 来定义一个枚举类型。例如: ```java public enum Season { SPRING, SUMMER, AUTUMN, WINTER; } ``` 特点 Java 定义枚举类型的语句很简约。它有以下特点: 1. 使用关键字 enum 2. 类型...

    java枚举类型说明

    使用Java枚举类型相比传统的`public static final`变量有许多优势: 1. **类型安全**: 枚举类型确保只能使用预定义的值,这有助于避免程序错误。 2. **自动实现接口**: 枚举类型自动实现了`Serializable`和`...

    java 枚举(enum) 详解(学习资料)

    可以通过 `values()` 方法获取枚举类型的全部枚举常量,返回一个枚举类型的数组。 总结来说,Java 枚举提供了一种强类型、安全且易于使用的机制,用于表示一组固定数量的值。它简化了代码,提高了程序的可读性和可...

    简单总结java枚举类型

    Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...

    理解java枚举类型

    Java枚举类型是Java语言中的一种特殊的类,用于定义一组固定的常量集合。它在Java中扮演着重要的角色,提供了一种安全、类型化的常量表示方式,比传统的final static变量更具有优势。理解Java枚举类型对于编写高质量...

    Java枚举类型.pdf

    总结起来,Java枚举类型是一个强大的工具,它可以替代`static final`常量来表示一组固定的值,提供类型安全、易于维护的代码。通过枚举,我们可以更方便地管理常量,减少错误,并增加代码的灵活性。枚举是Java中一个...

    java enum 枚举 学习资料

    Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举语法 在 Java 中,枚举类型是用 enum 关键字来定义的。枚举元素列表必须写在枚举类的最前面,每个元素之间用逗号隔开,...

    深入谈谈java的枚举(enum)类型

    在本文中,我们将深入探讨Java枚举的使用和实现方式。 首先,枚举可以看作是一种预定义的类,与基本数据类型(如int、char)相似,但其主要目的是限制变量只能赋值为枚举类型中定义的特定值。以下是一个简单的枚举...

    全面解读Java中的枚举类型enum的使用

    Java中的枚举类型`enum`是一种特殊的类,用于表示有限集合的值,这些值在运行时是不可变的。枚举在Java中被设计为安全、类型化且易于使用,适用于那些固定、有限且不会改变的数据类型。在本文中,我们将深入探讨枚举...

    Java枚举(enum) 详解7种常见的用法

    Java中的枚举(enum)是自...总结来说,Java枚举提供了一种结构化、类型安全的方式来定义和使用常量,还支持方法定义、接口实现以及与`switch`语句的无缝集成。这些特性使得枚举成为编写可维护、可扩展代码的重要工具。

    Java 枚举(enum)

    Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。 例如定义一个颜色的枚举类。 enum Color { RED, GREEN, BLUE; } 以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。 ...

    java枚举实例代码

    Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...

    Java中的Enum的使用与分析

    值得注意的是,枚举类型本质上是一个特殊的类,它继承自`java.lang.Enum&lt;E&gt;`。这意味着枚举类型可以拥有构造函数、方法和属性,就像任何其他类一样。 #### 枚举的实现机制 当编译上述枚举时,Java编译器会生成一个...

Global site tag (gtag.js) - Google Analytics