Java5新特性之枚举

1.  概念

  首先,枚举并不是一种新技术,而是一种基础数据类型.它隶属于两种基础类型中的值类型,如下:

  

2.  为什么要有枚举

  枚举在真正的开发中是非常常用的,它的作用很简单也很纯粹:它定义了一种规范,就是要让某个类型的变量的取值只能为若干个固定值中的一个,也就是要符合它定义的规范.它可以让编译器在编译时就可以识别程序中填写的非法值,一定程度上防止了运行时的非法类型值错误.

  例如:要定义星期几的变量,如果用普通变量1-7   分别表示星期一到星期日,但有人可能写成int weekday=0.这种错误只能到运行时才能发现,编译是没问题的。但如果用枚举代替普通变量,就可将错误在编译时识别。

  枚举本身当然是一个类,它的定义与使用与普通类很类似,而每个枚举变量都相当于类的一个对象。下面将分别介绍枚举的基本使用、带有构造方法的枚举、带有抽象方法的枚举。如下:

3.  基本使用

实例:

public class EnumTest2 {
	public static void main(String[] args) {
		WeekDay weekDay2 = WeekDay.FRI;
		//使用1:toString()方法
		System.out.println(weekDay2);//输出:FRI
		//使用2:name()方法
		System.out.println(weekDay2.name());//输出:FRI
		//使用3:ordinal()方法
		System.out.println(weekDay2.ordinal());	//输出:5
		//使用4:枚举变量的反射
		System.out.println(WeekDay.valueOf("SUN").toString());//输出:SUN
		//使用5:获取枚举的长度
		System.out.println(WeekDay.values().length);//输出:7
	}
	/**
	 * 定义枚举类--这里作为测试类的一个子类
	 */
	public enum WeekDay{
		SUN,MON,TUE,WED,THI,FRI,SAT;
	}
}

4.  带有构造方法的枚举

  首先有两点要求:

  ?  要求所有的东西都要在枚举变量之后写

  ?  构造方法必须是私有的

  使用:

  ?  当使用某一个枚举变量时,就会将所有的枚举变量都实例化并缓存;以后再次用到时不会再次实例化。

  ?  与普通类一样,枚举变量采用哪一个构造方法,也是根据参数的类型与个数而定。

  实例:

public class EnumTest {
	public static void main(String[] args) {
		WeekDay weekDay = WeekDay.MON;
		System.out.println("-------------");
		WeekDay weekDay2 = WeekDay.TUE;
		/*
		 * 输出结果如下:
		 	构造方法3
			构造方法2
			构造方法1
			构造方法1
			构造方法1
			构造方法1
			构造方法1
			-------------(结束)
		 * 上面调用MON时,所有的枚举变量的构造方法都被调用;再次调用TUE时没有再调用
		 * 表明,当使用某一个枚举变量时,就会将所有的枚举变量都实例化并缓存;
		 * 以后再次用到时不会再次实例化
		 */
	}
	/**
	 * 定义枚举类--这里作为测试类的一个子类
	 */
	public enum WeekDay{
		//与普通类一样,枚举变量采用哪一个构造方法,也是根据参数的类型与个数而定
		//如下SUN将采用构造方法3;MON采用构造方法2;其余的都采用构造方法1
		SUN(1,2),MON(1),TUE(),WED,THI,FRI,SAT;

		//构造方法1:
		private WeekDay(){System.out.println("构造方法1");}
		//构造方法2
		private WeekDay(int day){System.out.println("构造方法2");}
		//构造方法3
		private WeekDay(int day,int day2){System.out.println("构造方法3");}
	}

5.  带有抽象方法的枚举

  枚举类中的逻辑方法,肯定会涉及到所有的枚举变量,要进行逻辑判断就必须要使用大量的if…else语句。而使用抽象方法就可以将if…else语句转移成一个个独立的类。

  如,下面的交通灯枚举类中,若要计算下一个灯的颜色,普通的写法肯定要判断,如果当前“红灯”那么下一个灯为“绿灯”;如果当前为“绿灯”那么下一个灯为“黄灯”……;而如果使用抽象方法则可将一系列判断转移为一个个独立的类。实例:

	/**
	 * 定义枚举类
	 */
	public enum TrafficLamp{
		//"{}"表示一个匿名子类,所以就可以重写枚举的抽象方法。这里将if..else转化为了3个匿名子类
		RED(30){
			public  TrafficLamp nextLamp(){
				return GREEN;
			}
		},
		GREEN(45){
			public  TrafficLamp nextLamp(){
				return YELLOW;
			}
		},
		YELLOW(5){
			public  TrafficLamp nextLamp(){
				return RED;
			}
		};
		//抽象方法-计算下一个灯的颜色
		public abstract TrafficLamp nextLamp();
		private int time;//定义交通灯的持续时间
		private TrafficLamp(int time){this.time = time;}//构造方法
	}

6.  普通类模拟枚举类

  下面简单用普通类来模拟一下枚举类

  要素:

  ?  私有的构造方法

  ?  用一个个公有的静态成员变量模拟枚举变量

  ?  可以有若干公有方法或

  实例:

package TestPage;

public abstract class WeekDay {
	//?	私有的构造方法
	private WeekDay(){}
	//?	公有的静态成员变量SUN、MON模拟枚举变量,"{}"表示一个匿名子类
	public final static WeekDay SUN = new WeekDay(){
		@Override
		public WeekDay nextDay() {
			return MON;
		}
	};
	public final static WeekDay MON = new WeekDay(){
		@Override
		public WeekDay nextDay() {
			return SUN;
		}
	};
	//  抽象方法-转移计算nextDay的逻辑
	public abstract WeekDay nextDay();

	//普通的计算nextDay的方法,要用if...else判断
	/*public WeekDay nextDay(){
			if(this == SUN){
				return  MON;
			}else{
				return SUN;
			}
		}
	*/
	//公有方法
	public String toString(){
		return this==SUN?"SUN":"MON";
	}
}

7.  总结

  枚举是一个较特殊的“类”,枚举变量相当于枚举类的一个个对象。它定义一种规范,让枚举变量的取值必须符合它定义的规范,只能为若干个固定值中的一个,从而在一定程度上防止了运行时的非法类型值错误.

时间: 2024-08-02 14:51:12

Java5新特性之枚举的相关文章

[Java5新特性]枚举

什么是枚举类型 如果定义一个类来完成企业员工信息,员工信息包括姓名.年龄及职位等信息(职位只有WORKER.MANAGER及BOSS三个角色),具体完成代码如下: public class Demo { private String name; private Integer age; private String role; public String getRole() { return role; } public void setRole(String role) { this.role

Java5新特性

"JDK1.5/Java5"的一个重要主题就是通过新增一些特性来简化开发. 这些特性包括泛型,for-each循环,自动装包/拆包,枚举,可变参数, 静态导入,注解. 使用这些特性有助于我们编写更加清晰,精悍,安全的代码. 1.泛型(Generic)C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能.一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换.猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

java5 新特性

1.静态导入方法 Java代码   package com.java.new_features_jdk5; /** * * 一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*; * 这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法.当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了. * 然后在这个类中,就可以直接用方

[Java5新特性]Annotation注解

Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的"name=value"对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特殊的错误,不会影响代码的执行. 基本A

[Java5新特性]自动装箱/拆箱

自动装箱/拆箱概述 Java中具有基本类型(int,double,float,long,boolean,char,byte,short)和基本类型包装类(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我们实现基本类型与包装类之间的转换基本有两种方式: 一种为JDK5之前的方式,比如Integer i = Integer.valueof(5);(这里5为基本类型int,Integer包装类利用valueof()方法将其转换为Integer类型

[Java5新特性]可变参数

什么是可变参数 Java基础内容中,关于函数具有一种特性:重载,如果我们要完成多个数字想加的需求,可以按照以下代码完成: public class Demo { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { int sum1 = new Demo().a

[Java5新特性]类加载器

类加载器概述 类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.Class实例.一旦一个类被加入JVM中,同一个类就不会被再次加入了.正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识.在Java中,一个类用其全限定类名(包括包名和类名)作为标识:但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识. 例如以下案例,在JVM中两个同名的Person类是完全不同的,之间也互不兼容,因为类加载器不同. 上述情况转换成代码如下: 定义一个Per

java 28 - 5 JDK5的新特性 之 枚举的使用

上一章,自定义了枚举类,超级麻烦.. 所以,JAVA给了一个枚举类:类 Enum<E extends Enum<E>> 注意事项 定义枚举类要用关键字enum 所有枚举类都是Enum的子类 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略.建议不要省略 枚举类可以有构造器,但必须是private的,它默认的也是private的.枚举项的用法比较特殊:枚举(""); 枚举类也可以有抽象方法,但是枚举项