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是单一继承)。
相关推荐
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义一组相关的常量。枚举在Java中被设计为一种特殊的类,它们默认继承自`java.lang.Enum`抽象类,并且是单继承的,这意味着它们无法再继承其他类...
在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...
Java enum 的用法详解 Java enum(枚举)是一种特殊的数据类型,用于定义一组固定的常量。从 JDK 1.5 开始,Java 引入了 enum 机制,解决了传统的常量定义方式的不足。 用法一:常量 在 JDK 1.5 之前,我们定义...
### Java 枚举类型 enum 的使用详解 #### 一、枚举类型概述 在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来...
Java 枚举(enum)是Java 1.5 引入的一种新的数据类型,它用于表示一组相关的值,这些值可以被当作常量来使用。枚举类型比传统的静态常量更加安全,可读性更好,并且允许进行更丰富的定制。下面我们将详细探讨Java ...
总结来说,Java 枚举提供了一种强类型、安全且易于使用的机制,用于表示一组固定数量的值。它简化了代码,提高了程序的可读性和可维护性,同时也避免了传统的常量类或单例模式的一些潜在问题。通过深入理解和灵活...
### Java中的Enum枚举用法详解 #### 一、引言 在Java编程语言中,枚举(Enum)是一种特殊的数据类型,它被用来表示一组固定的常量集合。相比于使用常量接口或字符串来表示固定集合,枚举提供了更加安全且易于管理的...
Java 中枚举类 enum 的 values() 方法详解 Java 中的枚举类 enum 是一种特殊的类,通过使用 enum 关键字来定义。枚举类 enum 中有一个特殊的方法,values(),这个方法可以将枚举类转换为一个枚举类型的数组。通过...
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义固定的、不可变的值集合。枚举类型是`java.lang.Enum`抽象类的子类,提供了一种安全且类型化的常量表示方式。下面我们将深入探讨enum的使用...
Java 枚举类型 enum 的详解及使用 Java 枚举类型 enum 是 Java 语言中的一种特殊的数据类型,自从 JDK 1.5 引入枚举类型以来,它已经成为了 Java 程序员中的一种常用工具。本文将对 Java 枚举类型 enum 进行详解,...
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的常量表示机制。它不仅仅是一个简单的数据类型,而是一种特殊的类,能够帮助我们更好地管理和组织一组相关的常量。枚举类型使得代码更加清晰,易于理解和维护,...
总结起来,Java枚举类型是一个强大的工具,它可以替代`static final`常量来表示一组固定的值,提供类型安全、易于维护的代码。通过枚举,我们可以更方便地管理常量,减少错误,并增加代码的灵活性。枚举是Java中一个...
总结起来,Java枚举类型提供了丰富的功能,包括但不限于定义常量、属性、方法,以及实现抽象方法。这种类型使得代码更加规范,提高了代码的可读性和可维护性,减少了错误的可能性。在处理一组固定不变的值时,使用...
### Java的Enum知识点详解 #### 一、枚举的基本概念 在Java中,`enum`(枚举)是一种特殊的类,用于定义一组常量值。它可以帮助开发者限制一个变量的可能值,使其只能从预定义的一组选项中选择。枚举提供了一种更...
java初学者内容对于enum类型,可能仅仅停留在枚举项只有一个字段的数据,在实际开发中可能对着每个枚举项包含几个信息,key value,学生姓名,年龄,身高等,样例详细定义了包含多个值enum类型并使用,请参考文件
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...
Java 5 引入的枚举类型(enum)是面向对象编程中的一种重要特性,它为表示一组固定值提供了类型安全且强大的方式。在本文中,我们将深入探讨枚举类的概念、用法以及其与传统常量定义的区别。 1. 枚举类的定义与常量...