`

Effective Java(三)之小插曲:枚举剖析

阅读更多

      资料上说:enum是继承自java.lang.Enum的。我直接写了一下,连编译都通不过。后来又找资料才知道,这个继承是有编译器处理的。现在先直接拿下面的例子说事了:用java命令行直接查看编译好的WeekDay.class文件。

D:\workspace\enumtest\bin\com\lzw\enumtest>javap WeekDay
Compiled from "WeekDay.java"
public class com.lzw.enumtest.WeekDay extends java.lang.Enum{
    public static final com.lzw.enumtest.WeekDay MON;
    public static final com.lzw.enumtest.WeekDay TUE;
    public static final com.lzw.enumtest.WeekDay WED;
    public static final com.lzw.enumtest.WeekDay FUR;
    public static final com.lzw.enumtest.WeekDay FRI;
    public static final com.lzw.enumtest.WeekDay STA;
    public static final com.lzw.enumtest.WeekDay SUN;
    static {};
    public boolean getBoolean();
    public int getDay();
    public static com.lzw.enumtest.WeekDay[] values();
    public static com.lzw.enumtest.WeekDay valueOf(java.lang.String);
    com.lzw.enumtest.WeekDay(java.lang.String, int, int, com.lzw.enumtest.WeekDay);
}

      即便如此,想了解enum类型,还是要先了解一下java.lang.Enum类。跟进JDK 源码中,很容易发现Enum类的定义:

	public abstract class Enum<E extends Enum<E>> implements Comparable<E>,Serializable {
	
	}
	
	 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;
	}

 在enum元素比较是比较它们的ordinal。源码的东西这里不用多说……

下面直接拿例子解析:

1、枚举类WeekDay.java

package com.lzw.enumtest;

public enum WeekDay {
	MON(1), TUE(2), WED(3), FUR(4), FRI(5) {
		// 重写,替换父的return false
		@Override
		public boolean getBoolean() {
			return true;
		}
	},
	STA(6), SUN(7);
	private int day;

	// 必须私有化构造方法 ,因为枚举类的成员都是static final的 ,不提供外部赋值
	private WeekDay(int day) {
		this.day = day;
	}

	public boolean getBoolean() {
		return false;
	}

	public int getDay() {
		return day;
	}
}

 

2、测试类TestJava1.java

package com.lzw.enumtest;

import java.util.EnumMap;
import java.util.Iterator;
import java.util.Map.Entry;

public class TestJava1 {
	public static void main(String[] args) {
		for (WeekDay day : WeekDay.values()) {
			// :枚举重写了ToString(),说以枚举变量的值是不带前缀的
			switch (day) {
			case MON:
				System.out.println("周一:" + day.getDay() + " index:"
						+ day.ordinal() + " boolean:" + day.getBoolean());
				break;
			case TUE:
				System.out.println("周二:" + day.getDay() + " index:"
						+ day.ordinal() + " boolean:" + day.getBoolean());
				break;
			case FRI:
				System.out.println("周五:" + day.getDay() + " index:"
						+ day.ordinal() + " boolean:" + day.getBoolean());
				break;
			default:
				break;
			}
		}

		EnumMap<WeekDay, String> enumMap = new EnumMap<WeekDay, String>(WeekDay.class);
		
		enumMap.put(WeekDay.WED, "周三");
		enumMap.put(WeekDay.SUN, "周日");
		
		Iterator<Entry<WeekDay, String>> iterator = enumMap.entrySet().iterator();
		
		for (; iterator.hasNext();) {
			Entry<WeekDay, String> entry = iterator.next();
			System.out.println(entry.getKey().name() + "__" + entry.getValue());
		}

	}

}

 

      很明显枚举的每一个元素都是其实例,并且是static的哦。每一个ordinal都不相同,这也是java.lang.Enum的compareTo方法告诉我们的:不同元素,其ordinal不同。

      至于values()方法,直接看上面的编译好的代码

 

 

分享到:
评论

相关推荐

    1_Effective_Java_2nd_Edition_proglib_java_Joshua_

    2. **枚举类型**:Bloch强调了枚举类型在Java中的重要性,它比传统的常量类更安全,更易于使用,且能提供更多的功能,如枚举方法和枚举实例的集合操作。 3. **泛型**:第二版《Effective Java》详尽讨论了Java泛型...

    java优秀源码-Effective-Java-Concepts:Java源代码可以强化概念,我正在从JoshuaBloch的出色著作“Eff

    《Effective Java》是Java开发领域的一本经典著作,由知名程序员Joshua Bloch撰写。这本书深入探讨了如何编写高效、可维护的Java代码,并提出了许多实用的编程实践和设计原则。通过对书中源代码的分析,我们可以更...

    实践《Effective Java》书中的经验法则示例代码,结合Java源码来理解这些最佳实践,并应用于实际项目。.zip

    《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,书中总结了23条编程经验法则,旨在帮助开发者写出更高效、更可靠、更易于维护的Java代码。这个压缩包包含了作者在书中提到的一些示例代码,...

    java初学者应该阅读的书籍

    根据提供的信息,我们可以推测这三本书分别是Java初学者应该阅读的经典之作。接下来,我们将详细介绍这些书籍所涵盖的知识点以及它们对Java学习的重要性。 ### 第一本书:《Java核心技术》 #### 知识点概述 - **...

    阿巴巴里Java开发手册-effective coding

    《阿里巴巴Java开发手册》是阿里巴巴集团内部制定的一套Java编程规范,旨在提升代码质量和团队协作效率。手册的更新至2017.11.30的版本,内容与上市的实体书相差无几,因此这里我们将依据这个版本探讨一些核心的Java...

    EFFECT JAVA 中文

    《Effective Java》是一本经典且深受程序员喜爱的书籍,由Joshua Bloch撰写,中文版为《EFFECT JAVA 中文》。这本书深入探讨了Java编程的最佳实践和常见陷阱,旨在帮助开发者写出更高效、可维护的代码。书中分为多个...

    java学习资料.zip

    《Effective Java》是由Joshua Bloch编写的,他是一位经验丰富的Java开发者,也是Java平台的关键设计师之一。这本书分为多个条目,每个条目都详细介绍了如何编写更高效、更可靠和更易于维护的Java代码。以下是这两...

    java学习的全部收藏资料

    - **电子书籍**: 《Java核心技术卷Ⅰ:基础知识》、《Java核心技术卷Ⅱ:高级特性》、《Effective Java》等都是Java学习的经典书籍。 - **视频教程**: 雷迅快传分享的资源链接提供了大量Java实战项目的视频教程,...

    effective c++ 3rd 英文版

    此外,书中还涉及了新“TR1”标准库功能的应用以及与其他语言(如Java、C#、C)之间的差异分析,帮助开发者更好地理解和掌握C++的特性和编程方式。 #### 四、新增内容与更新 在第三版中,超过一半的内容都是全新的...

    JAVA类图书推荐.rar

    随着对Java的理解加深,可以阅读《Effective Java》(第3版)。作者Joshua Bloch深入剖析了如何编写高质量的Java代码,其中包含了大量实用的编程技巧和最佳实践。这本书对于提升代码质量有着极大的帮助。 进一步...

    Java知识、文档、项目、工具.zip

    - 第三方指南:如Effective Java、Head First Java等书籍,提供了深入理解和实践的指导。 - 在线教程:如Stack Overflow、Java Tutorials等网站,提供问题解答和学习路径。 3. **项目**: - 学习示例:小型项目...

    JAVA学习的合理规划

    - 推荐资源:《Effective Java》第三版详细介绍了如何有效地使用Java的新特性。 2. **数据库基础**: - 在实际项目开发中,数据库操作是一项非常重要的技能。虽然可以先学习Oracle,但MySQL因其易用性和普及率较...

    机器学习资源整理002不全

    标题“机器学习资源整理002不全”和描述中的“机器学习资源整理002不全-math_deep.effective-java”暗示了这份压缩包包含了关于机器学习和Java编程的资料,特别是数学基础和《Effective Java》这本书的相关内容。...

    Java设计模式之单例模式实例分析

    这是Joshua Bloch在《Effective Java》中推荐的方式,既简单又线程安全。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 在Android开发中,单例模式常用于如网络请求...

    BB07639201_00.pdf

    从给定的文件信息来看,我们讨论的核心是《Effective Java》一书,这是一本针对Java编程语言的深度指南,由美国计算机科学家Joshua Bloch撰写,中文版由潘爱民翻译。本书作为Sun公司核心技术丛书中的一员,以其独特...

    《吐血整理》十年风雨技术人的书单整理.pdf

    - **内容简介**:这本书是学习Java的重要参考书之一,通过丰富的示例帮助读者理解面向对象的设计思想。 - **关键知识点**: - Java语言的核心概念与设计模式。 - 高级编程技术,如泛型、注解等。 - 软件工程原则...

    推荐给程序员的经典电子书.docx

    - 覆盖了Java语言的基础语法和高级特性,如操作符、控制执行流程、访问权限控制、复用类、多态、接口、异常处理、字符串、泛型、数组、容器深入研究、Java I/O系统、枚举类型、并发以及图形化用户界面等内容;...

Global site tag (gtag.js) - Google Analytics