枚举类型详解
一.Enum详解
1.1枚举类型的介绍
JDK1.5加入了一个全新的类型的”类”—枚举类型,为此JDK1.5引入了一个新的关键字enum,我们可以这样定义一个枚举类型。
Demo:一个最简单的枚举类
public enum ColorType { RED, BLACK, YELLOW; }
运行结果
class Testenum { public static void main(String[] args) { System.out.println(ColorType.BLACK);//BLACK } }
遍历枚举ColorType的所有值
public static void main(String[] args) { //下面是for的增强循环方法,遍历枚举的所有值 for(ColorType color : ColorType.values()){ System.out.println(color);//RED BLACK YELLOW } }
1.2枚举类型的简单应用场景
描述一个人的状态:比如有以下状态SLEEP(睡觉),WORKING(工作),EATING(吃饭)
创建人的状态枚举类:
public enum PersonStatus { SLEEP,WORKING,EATING; }
打印出人的状态
public static void main(String[] args) { showStatus(PersonStatus.EATING); } public static void showStatus(PersonStatus status){ switch(status){ case SLEEP :System.out.println("正在睡觉");break; case WORKING:System.out.println("曾在工作");break; case EATING:System.out.println("正在吃饭");break; default:System.out.println("正在忙于其他事情"); } //输出结果是正在吃饭 }
注意:switch()只能用五种类型Char,byte,short,int,enum
1.3枚举的本质
定义枚举类型时本质上就是定义一个类别,只不过很多细节由编译器帮您完成了,所以在某些程度上,enum关键字的作用就像是class或interface。
当使用”enum”定义 枚举类型时,实质上定义出来的类型继承自java.lang.Enum类型,而每个枚举的成员其实就是您定义的枚举的一个实例,它们都是 public final static 类型的,所以你无法改变它们,可以直接使用。
JAVASE API 说明
Enum<E extends Enum<E>>是所有枚举类型的基类
说明了所有的enum类型的超类都是 java.lang.Enum
那么既然是一个类,那么就可以有成员以及构造方法。
下面新的PersonStatus枚举:
public enum PersonStatus { SLEEP("睡觉"),WORKING("工作"),EATING("吃饭"); String value; PersonStatus(String value){ this.value=value; } public String getValue(){ return this.value; } }
应用
public static void main(String[] args) { System.out.println(PersonStatus.SLEEP.getValue());//睡觉 }
可以看出比上面要简洁的多。
1.4枚举类型之间的比较
枚举类型的比较方法:compareTo(E o)
源码:
public final int compareTo(E o) { Enum other = (Enum)o; Enum self = this; if (self.getClass() != other.getClass() && // optimization self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException(); return self.ordinal - other.ordinal; }
可以看出枚举类型的比较主要在ordinal的变量的值
Ordinal值的解释:
/** * The ordinal of this enumeration constant (its position * in the enum declaration, where the initial constant is assigned * an ordinal of zero). * * Most programmers will have no use for this field. It is designed * for use by sophisticated enum-based data structures, such as * {@link java.util.EnumSet} and {@link java.util.EnumMap}. */ private final int ordinal;
意思是它是在枚举类型中声明的位置,第一个位置是0,以此类推。
一般用不到这个变量,只有在复杂的枚举结构类型中采用的到比较EnumSet,EnumMap(这两种类型在后面会讲到)。
Ordinal的demo:
public static void main(String[] args) { // 下面是for的增强循环方法,遍历枚举的所有值 for (ColorType color : ColorType.values()) { System.out.println(color + "的位置是 " + color.ordinal()); // RED的位置是 0 // BLACK的位置是 1 // YELLOW的位置是 2 } }
枚举比较的demo:
public static void main(String[] args) { compareToPersonStatus(PersonStatus.SLEEP); } public static void compareToPersonStatus(PersonStatus status){ for(PersonStatus stat : PersonStatus.values()){ System.out.println(status.compareTo(stat)); // 0 // -1 // -2 } }
二.枚举集合类型
2.1EnumSet
EnumSet的名称说明了其作用,它是J2SE 5.0后加入的新类别,可以协助建立枚举值的集合,它提供了一系列的静态方法,可以指定不同的集合的建立方式。
EnumSet的基本应用:
遍历枚举集合类型
public static void main(String[] args) { EnumSet<PersonStatus> set = EnumSet.of(PersonStatus.EATING, PersonStatus.SLEEP); // 遍历enumSet interratorPersonStatus(set); } public static void interratorPersonStatus(EnumSet<PersonStatus> set){ for (Iterator<PersonStatus> it = set.iterator(); it.hasNext();) { PersonStatus tmp = it.next(); System.out.println(tmp.getValue()); // 吃饭 // 睡觉 } }
上述用到的of方法,源码如下:
/** Creates an enum set initially containing the specified elements. * Overloadings of this method exist to initialize an enum set with * one through five elements. A sixth overloading is provided that * uses the varargs feature. This overloading may be used to create * an enum set initially containing an arbitrary number of elements, but * is likely to run slower than the overloadings that do not use varargs. * @param e1 an element that this set is to contain initially * @param e2 another element that this set is to contain initially * @throws NullPointerException if any parameters are null * @return an enum set initially containing the specified elements */ public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) { EnumSet<E> result = noneOf(e1.getDeclaringClass()); result.add(e1); result.add(e2); return result; }
意思是创建一个set集合,并利用 e1 e2初始化。
上述方法利用到的noneOf源码:
/** * Creates an empty enum set with the specified element type. * @throws NullPointerException if <tt>elementType</tt> is null */ public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { Enum[] universe = getUniverse(elementType); if (universe == null) throw new ClassCastException(elementType + " not an enum"); if (universe.length <= 64) return new RegularEnumSet<>(elementType, universe); else return new JumboEnumSet<>(elementType, universe); }
意思是创建一个指定类型的EnumSet集合,参数是class类型
noneOf Demo:
public static void noneOfPersonStatus(){ EnumSet<PersonStatus> set=EnumSet.noneOf(PersonStatus.class); set.add(PersonStatus.WORKING); set.add(PersonStatus.SLEEP); set.add(PersonStatus.EATING); interratorPersonStatus(set); //吃饭 // 工作 // 睡觉 }
利用noneOf的方法构造了Enumset,然后调用add方法添加枚举类型。
2.2 EnumMap
EnumMap的定义:EnumMap<K extends Enum<K>,V>
可以看出枚举映射中所有的键都必须来自单个枚举类型,该枚举类型在创建映射时显示或隐式的指定,枚举映射在内部表示为数组。
构造方法:
- EnumMap(Class <K> keyType)
- EnumMap(EnumMap<K,? extends V> m)
- EnumMap(Map<K,? extends V> m)
简单的应用demo:
public static void main(String[] args) { EnumMap<ColorType,String> map=new EnumMap<ColorType,String>(ColorType.class); map.put(ColorType.BLACK, "黑色"); map.put(ColorType.RED,"红色"); System.out.println(map.get(ColorType.RED));//红色 }
相关推荐
C语言枚举类型详解C语言枚举类型详解
枚举类型(enumerated type)是C语言中的一种自定义数据类型,它允许程序员定义一组相关的整数值集合,这些值通常表示特定的概念或状态。枚举类型提供了比直接使用整数常量更清晰的代码,增加了程序的可读性和可维护...
在C语言中,结构体(struct)、共用体(union)和枚举类型(enum)是三种重要的复合数据类型,它们允许程序员组合不同类型的数据以适应复杂的数据结构需求。 1. **结构体(Struct)** 结构体是用于组合不同类型...
C#中可枚举类型详解 C# 中的可枚举类型是指实现了 IEnumerable 和 IEnumerator 接口的类型,这些类型可以被 foreach 循环迭代。可枚举类型的主要特点是可以枚举一个集合中的数据项,例如数组、列表、哈希表等。 ...
在Java 5(也被称为Tiger)版本中引入,枚举类型极大地提高了代码的可读性、类型安全性和维护性。在本文中,我们将深入探讨Java枚举的定义、使用方法以及它如何改善传统使用`static final`常量的模式。 首先,让...
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
### 枚举类型详解 #### 一、枚举的基本概念与使用场景 枚举是一种特殊的类,用于封装一组固定的常量。它可以帮助我们更清晰地管理那些固定不变的数据,比如一年四季、一周七天等。枚举类型的使用,能够使程序更加...
C#中的枚举类型详解 在C#语言中,枚举类型是一种特殊的值类型,用于定义一组命名的常数。枚举类型可以在类声明中出现,用于声明一个新的枚举类型。枚举类型的声明包括枚举声明、枚举成员和枚举数值及操作等几个方面...
### C语言中的枚举类型详解 #### 一、概述 在C语言中,枚举(Enumeration)作为一种特殊的数据类型,其主要功能在于定义一组固定的、具有整数值的命名常量。这种类型的引入极大提升了程序的可读性和可维护性。通过...
Java 枚举类型是编程语言中的一个重要特性,它允许我们定义一组固定的、不可变的类实例,这些实例通常表示特定的常量或状态。在Java中,枚举类型提供了许多强大的功能,使得代码更加安全、易读且易于维护。下面我们...
接口描述符定义了设备的功能,端点描述符则定义了数据传输的路径和特性,如中断、批量、同步或控制传输类型。 7. **功能测试与设备使用**:枚举完成后,主机可以对设备进行功能测试,如读取设备特定寄存器、发送...
在这个例子中,`CompassPoint`是枚举类型,`North`, `South`, `East`, 和 `West`是其成员值。不同于C和Objective-C,Swift的枚举成员没有默认的整数值。它们是独立的枚举类型内的值,而不是整数序列。 2. 匹配枚举...
通过以上内容,我们可以看到Swift中的枚举类型非常灵活,不仅可以用于简单的值列举,还能携带额外信息、实现方法,使得枚举成为编写结构化代码的强大工具。在实际开发中,枚举类型被广泛应用于状态管理、数据解析、...
### Java 枚举类型详解 #### 一、引言 枚举类型(Enum)是Java 5.0引入的一种新特性,它为开发者提供了一种更安全、更灵活的方式来处理一组固定数量的常量。相比于传统的使用整型或字符串来表示特定的值,枚举类型...
TypeScript 中的枚举类型详解 在 TypeScript 中,枚举类型是一种特殊的数据类型,它是一个被命名的整型常数的集合,用于声明一组命名的常数。当一个变量有几种可能的取值时,可以将它定义为枚举类型。枚举类型非常...
枚举类型的大小是一个经常被讨论的话题,本文将深入探讨枚举类型的大小,及其与整数类型的关系。 在C++中,枚举类型是一种用户自定义的类型,它可以由开发者定义出不同的枚举值。例如, enums EType1 { e1 = CHAR_...
#### OpenFlags枚举类型详解 OpenFlags枚举类型定义了多种文件打开模式,主要包括: - **modeRead**:以只读方式打开文件。 - **modeWrite**:以只写方式打开文件。 - **modeReadWrite**:以读写方式打开文件。 - *...
### Java中枚举类型的使用详解 #### 一、引言 在软件开发过程中,经常会遇到需要定义一组固定的常量的情况,比如系统中的状态值、选项等。这些常量的定义方式直接影响到代码的可读性、可维护性和扩展性。在Java...
如果不正确地使用枚举类型代替整型,可能导致编译错误(如缺少特定的枚举类型重载运算符)或运行时问题(如内存对齐错误)。 总结来说,枚举在C++中是一种方便的工具,用于定义和管理一组相关的整型常量。理解枚举...