1.  概念

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

  

2.  为什么要有枚举

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

  比如:要定义星期几的变量,假设用普通变量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.  总结

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

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

  1. java--加强之 jdk1.5简单新特性,枚举,注解

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9944041 Jdk1.51新特性(静态导入,可变参数,加强for循环,自动拆装箱) 08.ja ...

  2. java5 新特性

    1.静态导入方法 package com.java.new_features_jdk5; /** * * 一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:i ...

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

    上一章,自定义了枚举类,超级麻烦.. 所以,JAVA给了一个枚举类:类 Enum<E extends Enum<E>> 注意事项 定义枚举类要用关键字enum 所有枚举类都是E ...

  4. java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类

    枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...

  5. java5新特性-加强for循环

    本文目标是加强for循环和普通for循环的比较.阅读本文大概3-5分钟 刚开始学习编程语言的时候接触了三种循环方式 1. for 常用 2. while 较常用 3 do ... while 不常用 ...

  6. Java5新特性对数组的支持

    增强for循环 → for-each for (参数类型参数名 : 数组名) { 代码块 } Eg: package reviewDemo; public class Demo6 { public s ...

  7. (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型

    Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...

  8. Hi java新特性

    java新特性 1995.5.23 java语言 1996 jdk1.0 250个类在API 主要用在桌面型应用程序1997 jdk1.1 500 图形用户界面编程1998 jdk1.2 2300 J ...

  9. JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性

      27.01  反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...

随机推荐

  1. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

    本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函 ...

  2. 初识ecside

    ecside,基于jsp tag的开源列表组件.支持导出pdf.xsl.csv等文件. 主要标签<ec:table>\<ec:row>\<ec:column>. 支 ...

  3. bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)

    4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...

  4. Swift EventKit的初学者指南–请求权限

    EventKit为获取和操作用户日历事件和提醒提供了一系列的类.在下面的教程中,我的目标是带领你走出利用EventKit建立一个应用程序的第.我的目标是带领你迈出利用EventKit建立一个应用程序的 ...

  5. poj--1236--Network of Schools(scc+缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14062   Accepted: 56 ...

  6. WEBSERVICE之JDK开发webservice

    转自:https://www.cnblogs.com/w-essay/p/7357262.html 一.开发工具与环境 1. jdk1.6版本以上(jdk1.6.0_21及以上版本) 2 .eclip ...

  7. 由GPS坐标计算半径

    在实际应用当中,一般是通过一个个体的编码来查找该编码对应的地区中心的经纬度,然后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的 ...

  8. dozer初探

    简介 Dozer是一款javaBean的映射工具,用于解决一个类到另外一个类的自动适配功能,它即支持简单的映射,也支持复杂类型的双向递归映射(官网). 示例 举个例子,假设说我们现在有User(用户) ...

  9. QQ自动登录里的一些控件知识

    在这个程序里面有个读取计算机指定文件的知识: private void button2_Click(object sender, EventArgs e) { openFileDialog1.Show ...

  10. 无意中发现destoon5商城处理订单时的一些bug

    最新的destoon5在商城的商品中加入了商品属性的功能,可以使用三个商品属性 而在代码中用如“49-3-0-0”来标记所选择的的商品及属性,其中第一个数字是商品的id,后三个表示的是商品对应的属性值 ...