`
一路欢笑一路走
  • 浏览: 11601 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

枚举类型详解

阅读更多

枚举类型详解

一.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语言枚举类型详解.doc

    C语言枚举类型详解C语言枚举类型详解

    C语言开发之枚举类型详解

    枚举类型(enumerated type)是C语言中的一种自定义数据类型,它允许程序员定义一组相关的整数值集合,这些值通常表示特定的概念或状态。枚举类型提供了比直接使用整数常量更清晰的代码,增加了程序的可读性和可维护...

    C结构体、共用体和枚举类型详解

    在C语言中,结构体(struct)、共用体(union)和枚举类型(enum)是三种重要的复合数据类型,它们允许程序员组合不同类型的数据以适应复杂的数据结构需求。 1. **结构体(Struct)** 结构体是用于组合不同类型...

    C#中可枚举类型详解

    C#中可枚举类型详解 C# 中的可枚举类型是指实现了 IEnumerable 和 IEnumerator 接口的类型,这些类型可以被 foreach 循环迭代。可枚举类型的主要特点是可以枚举一个集合中的数据项,例如数组、列表、哈希表等。 ...

    Java枚举类型.pdf

    在Java 5(也被称为Tiger)版本中引入,枚举类型极大地提高了代码的可读性、类型安全性和维护性。在本文中,我们将深入探讨Java枚举的定义、使用方法以及它如何改善传统使用`static final`常量的模式。 首先,让...

    java枚举类型说明

    ### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...

    枚举类型.pptx

    ### 枚举类型详解 #### 一、枚举的基本概念与使用场景 枚举是一种特殊的类,用于封装一组固定的常量。它可以帮助我们更清晰地管理那些固定不变的数据,比如一年四季、一周七天等。枚举类型的使用,能够使程序更加...

    详解c#中的枚举.pdf

    C#中的枚举类型详解 在C#语言中,枚举类型是一种特殊的值类型,用于定义一组命名的常数。枚举类型可以在类声明中出现,用于声明一个新的枚举类型。枚举类型的声明包括枚举声明、枚举成员和枚举数值及操作等几个方面...

    在C语言中的枚举类型.docx

    ### C语言中的枚举类型详解 #### 一、概述 在C语言中,枚举(Enumeration)作为一种特殊的数据类型,其主要功能在于定义一组固定的、具有整数值的命名常量。这种类型的引入极大提升了程序的可读性和可维护性。通过...

    JAVA枚举类型的用法详解

    Java 枚举类型是编程语言中的一个重要特性,它允许我们定义一组固定的、不可变的类实例,这些实例通常表示特定的常量或状态。在Java中,枚举类型提供了许多强大的功能,使得代码更加安全、易读且易于维护。下面我们...

    usb枚举过程详解

    接口描述符定义了设备的功能,端点描述符则定义了数据传输的路径和特性,如中断、批量、同步或控制传输类型。 7. **功能测试与设备使用**:枚举完成后,主机可以对设备进行功能测试,如读取设备特定寄存器、发送...

    Swift教程之枚举类型详解

    在这个例子中,`CompassPoint`是枚举类型,`North`, `South`, `East`, 和 `West`是其成员值。不同于C和Objective-C,Swift的枚举成员没有默认的整数值。它们是独立的枚举类型内的值,而不是整数序列。 2. 匹配枚举...

    Swift编程之枚举类型详解

    通过以上内容,我们可以看到Swift中的枚举类型非常灵活,不仅可以用于简单的值列举,还能携带额外信息、实现方法,使得枚举成为编写结构化代码的强大工具。在实际开发中,枚举类型被广泛应用于状态管理、数据解析、...

    列举java 枚举相关信息

    ### Java 枚举类型详解 #### 一、引言 枚举类型(Enum)是Java 5.0引入的一种新特性,它为开发者提供了一种更安全、更灵活的方式来处理一组固定数量的常量。相比于传统的使用整型或字符串来表示特定的值,枚举类型...

    前端大厂最新面试题-enum.docx

    TypeScript 中的枚举类型详解 在 TypeScript 中,枚举类型是一种特殊的数据类型,它是一个被命名的整型常数的集合,用于声明一组命名的常数。当一个变量有几种可能的取值时,可以将它定义为枚举类型。枚举类型非常...

    枚举大小sizeof 中枚举的大小详解.docx

    枚举类型的大小是一个经常被讨论的话题,本文将深入探讨枚举类型的大小,及其与整数类型的关系。 在C++中,枚举类型是一种用户自定义的类型,它可以由开发者定义出不同的枚举值。例如, enums EType1 { e1 = CHAR_...

    MFC下文件类_CFile.doc

    #### OpenFlags枚举类型详解 OpenFlags枚举类型定义了多种文件打开模式,主要包括: - **modeRead**:以只读方式打开文件。 - **modeWrite**:以只写方式打开文件。 - **modeReadWrite**:以读写方式打开文件。 - *...

    Java中枚举类型的使用.docx

    ### Java中枚举类型的使用详解 #### 一、引言 在软件开发过程中,经常会遇到需要定义一组固定的常量的情况,比如系统中的状态值、选项等。这些常量的定义方式直接影响到代码的可读性、可维护性和扩展性。在Java...

    枚举大小sizeof中枚举的大小详解.pdf

    如果不正确地使用枚举类型代替整型,可能导致编译错误(如缺少特定的枚举类型重载运算符)或运行时问题(如内存对齐错误)。 总结来说,枚举在C++中是一种方便的工具,用于定义和管理一组相关的整型常量。理解枚举...

Global site tag (gtag.js) - Google Analytics