`
wangjie2013
  • 浏览: 173484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK 5.0(Tiger)中的一些新特性(2):枚举

    博客分类:
  • JAVA
阅读更多

JDK 5.0(Tiger)中的一些新特性(2):枚举

 

Last modified:2013-04-06 23:56:12

**********************************************

 

枚举类型:

枚举类型:定义一种类型变量,它指向的值都是固定的。这些值称作枚举的元素,这些元素可以是这个枚举类或者其子类的一个实例对象。该类型的取值只可以是这些元素和null。

 

在没有枚举类型以前我们是怎样实现枚举的功能的呢?

 

下面是我们模拟枚举类型的一个事例:

 

public abstract class WeekDay1 {
	private WeekDay1() {
	}

	public final static WeekDay1 SUN = new WeekDay1() {

		@Override
		public WeekDay1 nextDay() {
			return MON;
		}

	};
	public static final WeekDay1 MON = new WeekDay1() {

		@Override
		public WeekDay1 nextDay() {
			return MON;
		}

	};

	public abstract WeekDay1 nextDay();

	public String toString() {
		return this == SUN ? "SUN" : "MON";
	}
}
   
  JDK 5.0后,我们可以怎样做:
  public enum WeekDay {
  SUN, MON, TUE, WED, THU, FRI, SAT
  }

 

 就像类和接口一样,enum关键字定义了一个新的引用类型。这些值就像static final字段一样(这就是为什么它们的名称一般用都大写来表示),WeekDay可以被指定为这七个值中的任意一个和null,但是不能是其他值。

 

思考:在刚接触到枚举的时候我很不解,既然我们可以自己构造一个和枚举功能相当的类,那么JDK在枚举的升级是不是就是简化操作和代码的升级呢?其实不然,简化操作是一方面,其实更重要的是提供了类型安全性。在5.0之前,我们会可能会使用int 型的1来表示SUN,剩下的以此类推,但是当我们应用weekday时,给一个weekday变量赋值的时候我们如果赋予的是一个大于7的值,那么编译是不会报错的。

 

5.0以前:

public static final int SUN = 1;

如果我们在另外一个地方引用SUN时:

正确的:int day = WeekDay.SUN;

错误但不会报错:int day = 45;

如果打印某个枚举类型,打印出来的就是枚举的字符串本身,与name()方法获得的一样。

 

下面是交通灯的一个枚举事例:

public enum TrafficLamp {
		Red(25) {
			@Override
			public TrafficLamp nextLamp() {
				return Green;
			}
		},
		Yellow(5) {
			@Override
			public TrafficLamp nextLamp() {
				return Red;
			}
		},
		Green(30) {
			@Override
			public TrafficLamp nextLamp() {
				return Yellow;
			}
		};
		public abstract TrafficLamp nextLamp();

		@SuppressWarnings("unused")
		private int time;
  //enum的构造方法必须私有
		private TrafficLamp(int time) {
			this.time = time;
		}
	} 

 

注意思考:枚举只有一个成员时,就可以作为单例的实现方式。

 

下面是引自《Java in a Nutsbell》中必须知道的enum特性,以了解及更有力的使用它们:

1. 枚举没有公共的构造函数,枚举类型唯一的实例就是这些枚举声明。

 

2. 枚举类型不是Cloneable,所以无法为现有的实例创建副本。

 

3. 枚举类型实现了java.io.Serializable,所以它们可以被序列化,但java的序列化机制会特别处理它们,以确保不会有新的实例被创建。

 

4. 枚举类型的实例是永远都不会变的:每一个枚举类型值都会保留它自己的特性。

 

5. 枚举类型的实例是存储于类型本身的public static final字段里,因为这些字段为final,所以它们不可能被不恰当的值改写。

 

6. 依照惯例,枚举类型的值都是使用大写字母来编写,就和其他static final字段一样。

 

7. 因为有一个严格限制的具有不同枚举值的集合,所以使用“==”运算符比较枚举值来代替调用equals() Method 一定是安全的。

 

8. 然而,枚举集合的确有个可行的equals() method。该method在内部使用==而且他被定义为final,所以他无法被覆盖。这个可行的equals() method允许枚举值被用作类似Set、List与Map Collection的成员。

 

9. 枚举类型有个可行的hashCode() method,与它们的equals() method一致。和equals()一样,hashCode()也被定义为final的。它允许枚举值配合类似java.util.HashMap这样的类一起使用。

 

10. 枚举类型实现了Java.lang.comparable,而且compareTo() method会依它们出现在enum声明里的顺序来排序枚举值。

 

11. 枚举类型包括了可行的toString() method,他会返回枚举值的名称。例如,WeekDay.SUN.toString()在默认情况下会返回“SUN”字符串,此method并没有被定义为final,enum类型可以依选择提供custom implementation。

 

12. 枚举类型提供了一个静态valueOf(),它与默认的toString()相反。把一个字符串变成一个枚举对象:static valueOf() Method。

 

13. ordinal():获得这个枚举类的index(从0开始的)。

 

14. 静态的values() method,返回一个包含完整元素的数组。

 

15. 枚举类型是java.lang.Enum的子类,他是在java5.0出现的(Enum 本身并不是枚举类型)。你不能以手动方式扩展Enum类以产生枚举类型,如果试图这样做,那么会产生变异错误。定义枚举类型的唯一方式就是使用enum关键字。

 

16. 要扩展枚举类型是不可能的。枚举类型实际上是final,但final关键字在它们的声明里是不必要且不被允许的!因为enum实际上是final,所以它不会是abstract。

 

17. 和类一样,枚举类型可以实现接口。

 

 

在5.0以后,switch语句除了支持byte、short、int和char外,还支持enum(枚举)。

如果switch表达式被判定为null,会抛出空指针异常(NullPointException)。使用null作为case的值是不合法的!可以try!而且在switch中使用枚举,一般要将default:子句包含进来,不然编译器会产生-Xlint警告信息,好让你知道你没有编写程序代码来处理枚举类型所有的可能值,即使你的每一个枚举都写了一个case时,也要将defaul:子句加进来,这可以处理在你的switch语句编译完成之后,有新的值被加入枚举类型的情况。

所以,在switch中使用枚举时,都要记得加default:子句。

分享到:
评论

相关推荐

    jdk1.5 tiger java5 新特性

    总的来说,JDK 1.5(Java 5.0)的新特性极大地提高了Java的生产力和代码质量。从泛型到增强的for循环,再到注解和枚举,这些改进都让Java开发者能够编写出更安全、更易于维护的代码。在实际开发中,理解并充分利用...

    JDK5_新特性

    Java开发工具包(JDK)5.0,代号Tiger,是Java语言的一个重要版本,带来了许多新特性和改进,极大地提升了开发效率和代码的可读性。以下是JDK5.0的主要新特性: 1. **自动封箱与自动解封**: 在JDK5.0之前,Java中...

    达内 corejava_partIII.ppt

    【Core Java Part III】是达内教育集团提供的一份关于Java高级编程的培训课件,主要涵盖了Java 5.0(也称为Tiger)的新特性和设计原则。这份课件强调了达内教育在IT培训中的高质量、稳定性和兼容性,旨在提升学员的...

    java SE(入门知识2)-JDK环境变量设置.docx

    2. **JDK 1.5(5.0)"Tiger"**:这个版本引入了泛型、枚举、自动装箱/拆箱、增强的for循环(foreach)等关键特性,显著提高了代码的可读性和安全性。 3. **JDK 1.6(6.0)"Mustang"**:这一版本进一步增强了性能,...

    Windows下1.1到1.8所有JDK.zip

    此版本的代号是"Project Tiger",引入了泛型、枚举类型、自动装箱/拆箱、注解等新特性,极大地提高了代码的可读性和安全性。此外,还引入了类型安全的变量迭代器,增强了反射API。 6. JDK 6 (2006年) JDK 6(代号...

    JDK各个版本及其代号1

    5. Java SE 5.0 "Tiger":这是Java历史上的一个重要里程碑,引入了泛型、枚举、可变参数、注解等关键特性,显著提升了代码的类型安全性和可读性。 6. Java SE 6 "Mustang":这个版本继续优化了JVM,引入了Swing的...

    Java_SE_Feature

    自 JDK 1.0 发布以来,Java 语言经历了多次重要的升级,其中最显著的变化出现在 JDK 5.0(代号 Tiger)。这一版本引入了多项新特性,包括: - **泛型 (Generics)**:允许在编译时检查类型安全,并避免了运行时的...

    java基础课程视频学习笔记分享.ppt

    - **2004年**:J2SE 5.0(即1.5.0),代号Tiger,引入了许多新特性,如泛型、枚举等。 - **2006年**:J2SE 6.0(即1.6.0),代号Mustang,进一步增强了Java平台的功能。 - **2011年**:Java SE 7.0,引入了更多的...

    java发展历程1.zip

    Java 5.0(代号Tiger)引入了泛型、枚举、注解等重要特性,增强了类型安全性和代码可读性。同时,增强了并发编程的支持,提升了性能。 6. Java 6(2006) Java 6(代号Mustang)继续优化性能,增强了对Web服务的...

    《Java程序设计》第一周学习总结.docx

    这些版本不仅修复了问题,还引入了新特性和功能,如J2SE 1.2引入了JDBC和CORBA技术,J2SE 5.0(Tiger)带来了泛型和枚举等重要改进。 Java的三大平台是Java EE(企业版)、Java SE(标准版)和Java ME(微型版)。...

    java发展历程

    - **J2SE Kestrel**:此版本中,Java平台获得了显著增强,包括Java 2 Platform, Standard Edition(J2SE)5.0的发布,该版本引入了泛型、枚举类型、自动装箱和拆箱等功能。 - **J2SE Merlin**:Merlin版本进一步优化...

Global site tag (gtag.js) - Google Analytics