`
Candy_Code
  • 浏览: 14477 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

枚举的深入理解

阅读更多
ps:没有研究就没有发言权!

1.枚举类型是一种取值被严格限定在一个有限的集合中的变量类型。
2.java中的枚举是一种特殊的类。每一个枚举都会被编译成一个class文件。
3.枚举主要用于限定变量的取值,从而从根源上有效的避免了非法的赋值。
4.声明一个枚举:
public enum Sex{
MALE,FEMALE
}
可以声明在一个类的内部,也可以声明在一个单独的文件里。
若声明在一个类的内部,则会被编译为 :
类名$Sex.class。
证明这时enum是以内部类的形式存在。
相信很多人不明白MALE,FEMALE到底是什么类型。请看这句代码:
Sex sex = Sex.MALE;
只有相同类型才可以赋值。枚举是一种特殊的类,那么sex就是一个类的引用,那么MALE必定也是一个类的引用。以下代码进一步证明了这一点。
Sex.FEMALE.name();
因为只有类才可以调用方法。
所以在声明一个enum的时候只需要指定引用变量的名字,系统就会自动创建对象,并把地址返回给你定义的引用变量。
5.下面我们来模拟enum
package com.jnmc.Enum;
public class Weekday {
	//构造方法必须私有	
//保证其他任何类都不能创建Weekday的实例
	private Weekday(){}
	private String value = null;
	//在静态初始化的时候创建对象
	//引用必须是共有的静态的
	public static Weekday SUN = getInstance("SUN");
	public static Weekday MON = getInstance("MON");
	public static Weekday TUE = getInstance("TUE");
	public static Weekday WED = getInstance("WED");
	public static Weekday THU = getInstance("THU");
	public static Weekday FRI = getInstance("FRI");
	public static Weekday SAT = getInstance("SAT");
		
	private static Weekday getInstance(String day){
		Weekday d = new Weekday();
		d.value = day;
		return d;
	}
	@Override
	public String toString(){
		return value;
	}
}


然后我们就可以使用它了,使用起来和Enum没有什么区别。
Weekday weekday = Weekday.SUN;
而且weekday 的值只能从集合{SUN,MON,TUE,WED,THU,FRI,SAT}中取,而不能被我们随便定义。
实际上,enum就是用类似的方法实现的。
6.使用有参构造方法创建enum
需注意:关于取值的定义必须放在enum体的开头
public enum Color{
	//创建Color实例时会默认调用无参的构造方法
	//RED(3)调用了有参数的构造方法
	//以下代码必须放在enum体的最开头(注释除外)
	RED(3),YELLOW,BLUE; //若之后还有内容,应为‘;’
	//注意构造方法只允许声明为私有的
	private Color(){
		System.out.println("constructor without 	parameters");
	}
	private Color(int i){
		System.out.println("constructor with one integer 	parameter");
	}
}

7.实现抽象方法
在enum体中声明了抽象方法,就将一个enum声明为一个抽象枚举了。这个enum就没法实例化,必须通过子类来实例化。

public enum Weekday{
		SUN(1){//用匿名内部类创建实例
			@Override
			public Weekday nextday() {
				return MON;///这里更进一步说明了,MON是Weekday类型的引用
			}
		},///两个枚举的取值之间用','
		MON{	
			@Override
			public Weekday nextday() {
				return TUE;			}
		},
		TUE{
			@Override
			public Weekday nextday() {
				return WED;
			}
		},
		WED{
			@Override
			public Weekday nextday() {
				return THUR;
			}
		},
		THUR{
			@Override
			public Weekday nextday() {
				return FRI;
			}
		},
		FRI{
			@Override
			public Weekday nextday() {
				return SAT;
			}
		},
		SAT{
			@Override
			public Weekday nextday() {
				return MON;
			}
		};///最后一个用‘;’
		///定义了一个抽象方法,
		//则在创建Weekday的时候就必须实现该抽象方法
		public abstract Weekday nextday();
		private Weekday(){}
		private Weekday(int i){}
	}


但是我们并不建议这样使用enum,这样会增加系统消耗。因为这样会生成7个匿名内部类的class文件,形如:
Weekday$1.class
Weekday$2.class
在开发的时候,我们会更多地使用基本类型来代替enum。
3
1
分享到:
评论

相关推荐

    Java面试枚举从使用到原理

    在Java编程语言中,枚举(Enumeration)是一种特殊的类,用于定义固定的、有限数量的值...理解枚举的使用和原理对于Java开发者来说至关重要,特别是在面试中,能够展现出对枚举深入理解的开发者通常会受到雇主的青睐。

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    深入理解 Java 枚举 Java 枚举是 Java 语言中的一种特殊类型,自 JDK 5 开始引入,使用 enum 关键字修饰。在 Java 中,枚举是一种受限制的类,具有自己的方法。枚举的本质是 java.lang.Enum 的子类,它提供了一些...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    通过深入理解这些概念,你可以更好地控制和调试你的Java程序,特别是在处理复杂的代码逻辑或需要动态操作类结构的场景下。反射与枚举的结合使用,可以为某些特定需求提供灵活的解决方案,但同时也需要注意滥用反射...

    深入理解C#中的枚举

    在C#编程语言中,枚举(Enumeration)是一种非常有用的数据类型,它允许我们为一组相关的整数值定义命名常量。通过使用枚举,代码的可读性...理解枚举的声明、成员、转换以及使用方法对于编写高质量的C#代码至关重要。

    枚举学习源代码

    通过"Enum_study"这个压缩包文件,你将能够找到与枚举相关的源代码示例,这将有助于你实践并深入理解枚举在不同情境下的应用。通过阅读相关文档和分析代码,你可以更好地掌握枚举的使用技巧,并将其应用于你的项目中...

    深入理解C# 第3版.zip

    通过阅读《深入理解C# 第3版》,读者不仅可以全面了解C#语言的各个方面,还能提升解决实际问题的能力,从而在软件开发领域取得更大的进步。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    易语言模拟枚举类型

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,...通过阅读和学习这段源码,可以深入了解易语言中如何实现枚举的模拟,以及如何在实际项目中应用这一技巧。这将有助于提高易语言编程的效率和代码质量。

    跟涛哥一起学嵌入式30:C语言枚举类型深入剖析.pdf

    今天就让我们跟随涛哥一起,深入理解C语言中的枚举类型,并且探讨它在Linux内核中的应用,以及使用枚举时需要注意的一些编程细节。 首先,枚举类型在C语言中通常有三种使用方法: 1. 先定义枚举类型,再定义枚举...

    枚举各类波形实例_枚举_数字波形_

    通过分析和修改这个程序,可以深入理解如何在实际项目中应用枚举和数字波形。 总之,“枚举各类波形实例”是一个将枚举数据结构与数字波形处理相结合的实际应用案例,它展示了如何通过编程来管理和呈现不同类型的...

    USB.zip_USB HUB _USB 枚举_usb_usb端口的枚举_枚举HUB

    本篇文章将深入探讨USB端口的枚举过程,特别是涉及到USB Hub的情况。 USB枚举是USB设备初始化的重要步骤,当USB设备插入到USB主机(Host)或Hub时,会自动进行枚举过程,以确保设备被正确识别和配置。这个过程主要...

    Java编程基础教程:枚举与泛型的深入讲解

    使用场景及目标:本文旨在提升读者对于Java中枚举和泛型的理解与应用能力,包括掌握如何高效地定义和使用枚举类型,理解并实现泛型程序设计的技巧,从而写出更为强大、灵活的代码。 其他说明:阅读本篇文章需要具备...

    Java枚举类型Enum的用法

    接下来,我们将深入探讨Java枚举类型的使用方法及其相关知识点。 1. **枚举的声明与初始化** 枚举类型的声明方式类似于类,但以`enum`关键字开头。例如: ```java enum Color { RED, GREEN, BLUE } ``` 这里...

    JAVA高级编程中Enum枚举

    在Java编程语言中,`Enum`(枚举)是一种特殊的...总之,深入理解并熟练运用Java的`Enum`枚举可以提升代码的可读性、安全性和效率。通过学习提供的资源,开发者将能更好地掌握枚举在各种场景下的应用,并提升编程技能。

    java枚举类型说明

    本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举类型在Java中的引入标志着一种更为类型安全且灵活的编程方式。 #### 二、Java枚举的基本概念 Java中的枚举是一种特殊的类,用于定义...

    mybatis入门实战之枚举类型

    本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...

    java 枚举学习心得

    通过深入理解枚举的特性和用法,可以更好地应对各种编程场景,尤其是在处理固定值集合或需要类型安全的场合。在Java EE和Android开发中,枚举也扮演着不可或缺的角色,特别是在设计模式和框架的实现中。因此,掌握...

    易语言暴力枚举驱动

    同时,由于驱动程序涉及到内核级别操作,所以需要对Windows内核编程有深入的理解,包括IRP(I/O请求包)处理、设备驱动模型(WDM或KMDF)等。 在实际应用中,暴力枚举驱动的源码可能会包含以下几个部分: 1. **...

    Java中的“枚举类型

    本文将深入探讨枚举类型的关键概念及其应用场景,并对比使用`static final`字段的优劣。 #### 二、枚举类型的核心功能 **1. 统一命名的常量** 枚举的主要作用在于以统一命名的方式替换那些变化无常的直接量。例如...

    谈谈你可能并不了解的java枚举

    枚举在Java编程语言中是一种强大的工具,常用于表示固定数量的值...通过深入理解枚举的内部机制和高级特性,我们可以编写出更加优雅、高效和易于维护的代码。因此,对枚举的深入探索对于提升Java编程技能是至关重要的。

    usb枚举过程详解

    例如,通过收发抓包,我们可以看到每个阶段的详细请求和响应,有助于深入理解USB通信机制。 图解案例是学习USB枚举的直观方式,它们通常展示每个步骤的详细流程图,帮助初学者更清晰地理解复杂的USB协议。在USB枚举...

Global site tag (gtag.js) - Google Analytics