`
Candy_Code
  • 浏览: 13959 次
  • 性别: 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 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    SpringBoot 枚举类型转换

    在SpringBoot 项目中实现枚举转换,需要创建BaseEnumTypeHandler 类继承BaseEnum 和 BaseTypeHandler 等相关类。想要详细了解如何实现枚举转换的话,那你快点下载后深入理解吧!

    深入理解C语言指针的秘密.doc

    你还在为了不能掌控指针的而苦恼吗?仔细阅读本文,你将发现指针原来并不像你想象的那么难以理解!

    深入理解C#中的枚举

    枚举类型是一种的值类型,它用于声明一组命名的常数。 (1)枚举的声明:枚举声明用于声明新的枚举类型。访问修辞符 enum 枚举名:基础类型 代码如下: { 枚举成员 }基础类型必须能够表示该枚举中定义的所有枚举数值。...

    深入理解C++11

    《深入理解C++11:C++11新特性解析与应用》内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    深入理解c++11

    《深入理解C++11:C++11新特性解析与应用》内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    深入了解Python枚举类型的相关知识

    主要介绍了深入了解Python枚举类型的相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    深入理解c++11新特性解析与应用

    《深入理解C++11:C++11新特性解析与应用》内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    深入理解C++11:C++11新特性解析与应用

     《华章科技:深入理解C++11:C++11新特性解析与应用》一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中的所有特性进行了分类,呈现了C++11新特性的原貌;第2章讲解了在保证与C语言和旧版C++标准充分...

    深入理解C++11:C++11新特性解析与应用 pdf

    《华章科技:深入理解C++11:C++11新特性解析与应用》一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中的所有特性进行了分类,呈现了C++11新特性的原貌;第2章讲解了在保证与C语言和旧版C++标准充分兼容...

    C#实现获取枚举中元素个数的方法

    主要介绍了C#实现获取枚举中元素个数的方法,是深入理解C#程序设计所需要掌握的基本技巧,需要的朋友可以参考下

    深入解析ATL(第2版).pdf

    深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、理解并正确实现IUnknown、充分利用ATL提供的Smart Types、撰写能够暴露COM服务器上COM对象的粘合代码、利用...

    [深入解析ATL(第2版)].(美)塔瓦瑞斯.扫描版(ED2000.COM).part2

    深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、理解并正确实现IUnknown、充分利用ATL提供的Smart Types、撰写能够暴露COM服务器上COM对象的粘合代码、利用...

    C# Rx的主要接口深入理解

    C# Rx的主要接口深入理解  IObservable / IObserver 接口在.NET Framework 4.0基类库中可用,并且它们包含在可以安装在.NET 3.5,Silverlight 3和4以及JavaScript中的包中。 IObservable/IObserver  Rx将异步和...

Global site tag (gtag.js) - Google Analytics