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()方法,直接看上面的编译好的代码

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值