定义
Java 枚举是一个特殊的类,一般表示一组常量。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
例如定义一个星期的枚举类。
enum Week
{
SUNDAY, MONDAY, TUESDAY,WEDNUESDAY,FRIDAY,SATURDAY;
}
public class Test
{
// 执行输出结果
public static void main(String[] args)
{
Week w1 = Week.SUNDAY;
System.out.println("today is " w1);
}
}
特点
- 使用关键字enum
- 类型名称
- 枚举可以单独定义在一个文件。
- 枚举可以实现一个或多个接口(Interface)
- 可以定义新的变量
枚举的常用方法
int compareTo(E o)
比较此枚举与指定对象的顺序。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。
// Enum 中的源码
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;
}
String name()
返回实例的名称。
static values()
返回一个包含全部值的数组,可以用来遍历所有值。
String toString()
返回此实例的名称。
// Enum 中 name() 和 toString()
public String toString() {
return name;
}
public final String name() {
return name;
}
int ordinal()
返回枚举值的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定。
<T extends Enum<T>> valueOf()
返回带指定名称的指定枚举类型的枚举常量,名称必须与在此类型中声明枚举常量所用的标识符完全匹配(不允许使用额外的空白字符)。这个方法与toString相对应,因此重写 toString()
方法,一定要重写 valueOf()
方法(我们可以重写 toString()
方法,但不能自己重写 valueOf()
方法,当我们重写 toString()
方法时,valueOf()
方法会自动重写。)
枚举的应用
用法一:常量
enum Week
{
SUNDAY, MONDAY, TUESDAY,WEDNUESDAY,FRIDAY,SATURDAY;
}
用法二:switch
enum Week
{
SUNDAY, MONDAY, TUESDAY,WEDNUESDAY,THURSDAY,FRIDAY,SATURDAY;
}
public class Test {
Week week = Week.SUNDAY;
public void change() {
switch (week) {
case SUNDAY:
week = Week.SUNDAY;
break;
case MONDAY:
week = Week.MONDAY;
break;
case TUESDAY:
week = Week.TUESDAY;
break;
case WEDNUESDAY:
week = Week.WEDNUESDAY;
break;
case THURSDAY:
week = Week.THURSDAY;
break;
case FRIDAY:
week = Week.FRIDAY;
break;
case SATURDAY:
week = Week.SATURDAY;
break;
}
}
}
用法三:向枚举中添加新方法
public enum Week {
SUNDAY("星期日", 0), MONDAY("星期一", 1), TUESDAY("星期二", 3), WEDNUESDAY("星期三", 4), THURSDAY("星期四", 1), FRIDAY("星期五", 3), SATURDAY("星期六", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Week(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
用法四:覆盖枚举的方法
public enum Week {
SUNDAY("星期日", 0), MONDAY("星期一", 1), TUESDAY("星期二", 3), WEDNUESDAY("星期三", 4), THURSDAY("星期四", 1), FRIDAY("星期五", 3), SATURDAY("星期六", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Week(String name, int index) {
thisname = name;
thisindex = index;
}
//覆盖方法
@Override
public String toString() {
return thisindex+"_"+thisname;
}
}
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
public interface Behaviour {
void print();
String getInfo();
}
public enum Week implements Behaviour{
SUNDAY("星期日", 0), MONDAY("星期一", 1), TUESDAY("星期二", 3), WEDNUESDAY("星期三", 4), THURSDAY("星期四", 1), FRIDAY("星期五", 3), SATURDAY("星期六", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Week(String name, int index) {
thisname = name;
thisindex = index;
}
//接口方法
@Override
public String getInfo() {
return thisname;
}
//接口方法
@Override
public void print() {
Systemoutprintln(thisindex+":"+thisname);
}
}
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}