简介:
enum是JAVA SE5中新添加的特性,关键字enum可以将一组具名的值的有限集合创建为一种新的类型(即枚举类)这些具名的值可以作为常规的程序组件使用。
首先看一个最简单的enum类:
public enum Color{
RED, GREEN, YELLOW
}
看起来像一个普通的类,据“一切皆对象”的宗旨来看,enum的确是一个“不普通”的类,事实上,在创建enum时,编译器会为你创建一个相关类,这个类继承自java.lang.Enum。Enum类实现了Compareable和Serializable接口。
enum的简单特性:
1.什么是枚举类
简介中介绍了:枚举类是一组具名的值的有限集合。那么其中具有的值是什么的,类除了自己的属性 & 方法(包括构造方法)就只剩下对象了。而上文中的Color枚举类中并无属性 & 方法,故此RED、GREEN、YELLOW这些“具名的值”实际上是类的对象。(这就是枚举类的特殊之处,在定义类的时候,类对象被同时定义封装了)。
而且这些枚举值(对象)都是常量的,即public static final 类型的。
想一下也是合情合理的。
枚举类就是外部访问的,public肯定是必须的;
枚举类的用途主要是为了区分有限集合的分类情况,并不主要用于实现什么功能,只需要为其他类提供引用即可。更何况在类定义的时候对象已经生成,因此static也是必要的;
枚举类是类构造者定义的,并不允许客户端程序员修改,因此final也是必要的。
画外音:按照命名惯例都用大写字母表示(多个单词中间用下划线隔开)
2.一个更加丰满的枚举类
既然枚举类是类,就可以有自己的成员变量、方法以及构造器。看下面的例子:
public enum Color{ RED("It's RED now ,stop crossing the road"), GREEN("It's GREEN ,you can go through"), YELLOW("It's YELLOW,you'd better wait for a while"); private String description; private Color(String description){ this.description = description; } public String getDescription(){ return description; } }
这里有几点需要稍稍留意一下:
a).如果你定义了自己的方法(包括构造器)则必须在enum实例序列的最后添加一个分号(注意:简单enum类是没有分号的)
b)自定义的方法(包含重写的方法) 和属性,必须写在enum实例之后,否则会编译错误
c)这里我们将构造器声明为private,其实我们只能在enum类的内部使用其构造器创建 枚举实例,一旦enum类定义结束,编译器就不允许我们在使用构造器来创建任何对象了,因此即便不声明为private对其访问性也没有任何区别(根据http://www.iteye.com/problems/81762所讲,构造器是可以声明为public的,但是eclipse还是报错了,不解)
d)enum类是final类型,无法被继承。
3.枚举类的常用方法
jd大神的博客中已经交代了,就不再啰嗦http://249326109.iteye.com/blog/1681605
4.switch中的enum
一直以为枚举跟switch是绝配,使用起来是非常方便的 ,这里copy一下jd的代码
package enumTest; public class EnumTest { enum Color { RED(255, 0, 0), BLUE(0, 0, 255), BLACK(0, 0, 0), YELLOW(255, 255, 0), GREEN( 0, 255, 0); // 构造枚举值,比如RED(255,0,0) private Color(int rv, int gv, int bv) { this.redValue = rv; this.greenValue = gv; this.blueValue = bv; } public String toString() { // 自定义的public方法 return super.toString() + "(" + redValue + "," + greenValue + "," + blueValue + ")"; } private int redValue; // 自定义数据域,private为了封装。 private int greenValue; private int blueValue; } public static void main(String args[]) { // Color colors=new Color(100,200,300); //错误,因为这个方法是私有的 Color color = Color.RED; System.out.println(color); // 调用了toString()方法 System.out.println(Color.BLACK.ordinal()); // values 方法返回 Color[] colors = Color.values(); for (Color c : colors) System.out.println(c); Color c = Color.RED; switch (c) { case RED: System.out.println("it's red"); break; case BLUE: System.out.println("it's blue"); break; case BLACK: System.out.println("it's blue"); break; } } }
值得注意的是:编译器并不要求switch中有default语句,也不要求每个枚举实例都有相应的case,所以要注意覆盖掉所有的分支。但是,如果在case语句中调用了return语句(无论是否覆盖所有的枚举实例),编译器就会要求default语句了。
相关推荐
### Python模拟enum枚举类型的方法详解 在Python中,并没有内置的枚举(`enum`)类型,但这并不意味着我们无法实现...对于新项目或Python 3.4及更高版本的应用来说,推荐直接使用官方提供的`enum`模块来实现枚举类型。
本文旨在深入探讨`typedef`的功能、用法及其在实际编程中的应用。 #### `typedef`的基本概念 `typedef`本质上是对已存在的数据类型赋予一个新的别名,这有助于代码更加清晰、易于理解和维护。例如: ```c typedef...
枚举类型的一个典型应用场景是在状态机编程中表示状态。例如,假设有一个简单的游戏状态机: ```c enum GAME_STATE { GAME_START = 1, GAME_PLAYING, GAME_PAUSE, GAME_OVER }; void gameLoop() { enum GAME_...
- `const`常量可以在编译时进行类型检查,而宏常量仅进行简单的文本替换,可能导致边际效应(比如预处理器的副作用)。 2. **const 修饰类的数据成员**: - 类的`const`数据成员如`const int size;`,在类的每个...
1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型数据29 2.3.6字符型数据30 ...
### 小结 综上所述,`LogManager`类为C#应用程序提供了一种简单而强大的日志记录解决方案。通过灵活的配置选项和多样化的记录方法,开发者可以根据实际需求定制化地管理日志信息。无论是Web应用还是Windows Forms...
本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 ...
本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 ...
如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
小结 23 术语表 23 第Ⅰ部分 C++基础 27 第2章 变量和基本类型 29 2.1 基本内置类型 30 2.1.1 算术类型 30 2.1.2 类型转换 32 2.1.3 字面值常量 35 2.2 变量 38 2.2.1 变量定义 38 2.2.2 变量...
小结 23 术语表 23 第Ⅰ部分 C++基础 27 第2章 变量和基本类型 29 2.1 基本内置类型 30 2.1.1 算术类型 30 2.1.2 类型转换 32 2.1.3 字面值常量 35 2.2 变量 38 2.2.1 变量定义 38 2.2.2 变量...