`

enum 学习

    博客分类:
  • java
 
阅读更多

转自:http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.html

java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

    下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:

1. 原始的接口定义常量

2. 语法(定义)

3. 遍历、switch 等常用操作

4. enum 对象的常用方法介绍

5. 给 enum 自定义属性和方法

6. EnumSet,EnumMap 的应用

7. enum 的原理分析

8. 总结

原始的接口定义常量

public interface IConstants {
    String MON = "Mon";
    String TUE = "Tue";
    String WED = "Wed";
    String THU = "Thu";
    String FRI = "Fri";
    String SAT = "Sat";
    String SUN = "Sun";
}

语法(定义)

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

package com.hmw.test;
/**
 * 枚举测试类
 * @author <a href="mailto:hemingwang0902@126.com">何明旺</a>
 */
public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

这段代码实际上调用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
    ... ...

遍历、switch 等常用操作

对enum进行遍历和switch的操作示例代码:

public class Test {
    public static void main(String[] args) {
        for (EnumTest e : EnumTest.values()) {
            System.out.println(e.toString());
        }
          
        System.out.println("----------------我是分隔线------------------");
          
        EnumTest test = EnumTest.TUE;
        switch (test) {
        case MON:
            System.out.println("今天是星期一");
            break;
        case TUE:
            System.out.println("今天是星期二");
            break;
        // ... ...
        default:
            System.out.println(test);
            break;
        }
    }
}
输出结果:
MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二

enum 对象的常用方法介绍

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

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

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

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

String toString()

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

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

public class Test {
    public static void main(String[] args) {
        EnumTest test = EnumTest.TUE;
          
        //compareTo(E o)
        switch (test.compareTo(EnumTest.MON)) {
        case -1:
            System.out.println("TUE 在 MON 之前");
            break;
        case 1:
            System.out.println("TUE 在 MON 之后");
            break;
        default:
            System.out.println("TUE 与 MON 在同一位置");
            break;
        }
          
        //getDeclaringClass()
        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
          
        //name() 和  toString()
        System.out.println("name(): " + test.name());
        System.out.println("toString(): " + test.toString());
          
        //ordinal(), 返回值是从 0 开始
        System.out.println("ordinal(): " + test.ordinal());
    }
}
输出结果:
TUE 在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1

给 enum 自定义属性和方法

给 enum 对象加一下 value 的属性和 getValue() 的方法:

package com.hmw.test;
  
/**
 * 枚举测试类
 
 * @author <a href="mailto:hemingwang0902@126.com">何明旺</a>
 */
public enum EnumTest {
    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
        @Override
        public boolean isRest() {
            return true;
        }
    },
    SUN(0) {
        @Override
        public boolean isRest() {
            return true;
        }
    };
  
    private int value;
  
    private EnumTest(int value) {
        this.value = value;
    }
  
    public int getValue() {
        return value;
    }
  
    public boolean isRest() {
        return false;
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
    }
}
输出结果:
EnumTest.FRI 的 value = 5

EnumSet,EnumMap 的应用

public class Test {
    public static void main(String[] args) {
        // EnumSet的使用
        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
        for (EnumTest day : weekSet) {
            System.out.println(day);
        }
  
        // EnumMap的使用
        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
        weekMap.put(EnumTest.MON, "星期一");
        weekMap.put(EnumTest.TUE, "星期二");
        // ... ...
        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry<EnumTest, String> entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }
    }
}

原理分析

        enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{
    public static final com.hmw.test.EnumTest MON;
    public static final com.hmw.test.EnumTest TUE;
    public static final com.hmw.test.EnumTest WED;
    public static final com.hmw.test.EnumTest THU;
    public static final com.hmw.test.EnumTest FRI;
    public static final com.hmw.test.EnumTest SAT;
    public static final com.hmw.test.EnumTest SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.hmw.test.EnumTest[] values();
    public static com.hmw.test.EnumTest valueOf(java.lang.String);
    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结

    可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

分享到:
评论

相关推荐

    TestEnum.zip_DEMO_enum学习

    在这个"TestEnum.zip_DEMO_enum学习"中,我们可以深入探讨C#中的枚举用法和相关知识点。 首先,枚举在C#中是用`enum`关键字定义的。它允许我们为整型值创建一个可读性更强的命名空间。例如: ```csharp enum Color...

    javaenum学习.pdf

    以下是对`javaenum学习.pdf`中提到的Java枚举相关知识点的详细说明: 1. **枚举元素定义**: - 枚举元素的列表必须写在枚举类的开头,元素之间用逗号分隔。如果元素列表后面没有其他内容,可以不加分号;如果有...

    java enum 枚举 学习资料

    "Java Enum 枚举学习资料" Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举...

    Laravel开发-laravel-enum

    解压后,你可以查看源代码了解其具体实现方式,学习如何在自己的项目中应用和扩展这个库。通常,`tests`目录下的单元测试能帮助理解枚举类的用法和预期行为。 总之,`laravel-enum`是一个强大的工具,它将枚举概念...

    Java enum的用法详解

    在Java编程语言中,`enum`(枚举)是一种特殊的类,用于定义一组固定的常量。...在阅读《https://bijian1013.iteye.com/blog/2309669》这篇博客时,你可以深入学习更多关于Java `enum`的高级用法和技巧。

    PyPI 官网下载 | aenum-1.2.1.tar.gz

    **PyPI 官网下载 | aenum-1.2.1.tar.gz** 在Python编程语言中,`PyPI`(Python Package Index)是官方的软件仓库,它为开发者提供了存储...通过深入学习和使用`aenum`,可以显著提高Python项目的代码质量和可维护性。

    java enum枚举教程学习资料

    Java枚举(enum)是Java语言提供的一种特殊的数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中是类的子类型,因此,它们具备类的一些特性,比如可以有方法、变量以及实现接口。...

    ATL 演示实例enum,collection,event,win

    通过学习和理解这些ATL实例,开发者可以提高在COM编程中的效率,减少错误,并更好地利用C++的模板机制。ATL不仅简化了COM组件的实现,还提供了对底层Win32 API的直接访问,使其成为Windows平台上构建高效轻量级组件...

    Java中的Enum的使用与分析

    通过本文的学习,我们了解了Java中枚举类型的基本概念、特点以及如何使用。枚举类型不仅提供了更清晰的代码可读性和可维护性,还确保了类型的安全性。在实际开发中,合理利用枚举类型能够有效提升代码质量和程序的...

    DNS-ENUM.rar_ENUM/DNS_dns _enum 域名解析

    实现一个DNS域名解析服务器,通常是为了学习、测试或创建自定义的DNS解决方案。一个简单的DNS服务器可能包括解析查询、缓存响应和转发请求等功能。通过这样的实现,用户可以更好地理解DNS工作原理,并可能定制自己...

    enum-v50.rar_enum_一卡通_校园一卡通

    【标题】"enum-v50.rar_enum_一卡通_校园一卡通" 提供的是一个关于校园一卡通系统与枚举(enum)应用的实例。枚举在编程中是一种特殊的类型,用于定义一组预定义的常量,这在处理固定选项如状态、角色或类型时非常...

    C++枚举类型enum与enum class的使用

    C++枚举类型enum与enum class的使用 以下是C++枚举类型enum与enum class...C++枚举类型enum与enum class的使用是非常重要的知识点,它们之间的区别和使用方法都需要我们认真学习和掌握,以便更好地应用于实际开发中。

    Struct、union、enum

    通过本文的学习,我们可以了解到C语言中结构体、联合和枚举的基本概念及其使用方法。这些数据类型为我们提供了更加灵活的方式来组织和管理数据,使得程序的设计更为简洁高效。掌握这些基础知识对于进一步学习高级...

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

    Java 枚举(enum)是 Java 语言中的一个重要特性,自 Java 5 开始引入。枚举用于定义一组相关的常量,这些常量通常代表一个有限的、预定义的值集合。枚举类是一种特殊的类,它具有以下特点: 1. **枚举类的声明**:...

    Enum Device

    在IT领域,枚举(Enum)是一个常见的编程概念,它涉及到对系统资源或特定对象集合的遍历和处理。在本例中,"Enum Device"指的是枚举...通过学习和实践这样的代码,开发者可以提升在系统级编程和硬件交互方面的能力。

    JAVA高级编程中Enum枚举

    本资源包提供了一些关于`Enum`枚举的深入学习材料,包括实例、常见问题以及相关的文档,非常适合Java开发者进行高级编程的学习和复习。 首先,枚举的基本语法是定义一个公共类,前面加上关键字`enum`。例如: ```...

    7enum枚举字函数程序案例VC共4页.pdf.zip

    5. **程序案例分析**: 分析这样的案例有助于学习者理解如何在实际项目中应用枚举函数,以及如何使用7enum工具进行系统枚举。这可能包括如何初始化枚举、遍历结果、处理每个枚举项以及如何与系统交互。 6. **安全...

    enum_display.zip_DEMO

    总的来说,这个示例项目提供了关于如何在软件中使用枚举处理显示模式的实践教程,对于学习编程、图形用户界面设计以及系统级编程的开发者来说,是一个很有价值的学习资源。通过研究和理解这个示例,开发者可以更好地...

    7enum和switch语句联合案例分析VC共6页.pdf

    总之,通过学习和实践`enum`和`switch`的联合使用,开发者可以编写出更加清晰、高效的代码,这对于任何编程项目,尤其是VC++项目,都是非常有价值的。这份6页的分析文档无疑是深入理解这两个概念并提升编程技能的...

    PyPI 官网下载 | aenum-2.0.6-py2-none-any.whl

    《PyPI上的Python库"aenum"详解》 在Python编程中,PyPI(Python Package Index)是官方的软件仓库,提供了海量的第三方模块...无论你是Python的新手还是经验丰富的开发者,"aenum"都是值得尝试和学习的一个优秀工具。

Global site tag (gtag.js) - Google Analytics