原始的接口定义常量
|
public interface IConstants
{
String
MON = "Mon";
String
TUE = "Tue";
String
WED = "Wed";
String
THU = "Thu";
String
FRI = "Fri";
String
SAT = "Sat";
String
SUN = "Sun";
}
|
语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum
类的子类(java.lang.Enum
是一个抽象类)。枚举类型符合通用模式 Class
Enum《E
extends Enum《E》》,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected
Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
|
package com.hmw.test;
public enum EnumTest {
MON,
TUE, WED, THU, FRI, SAT, SUN;
}
|
这段代码实际上调用了7次 Enum(String name, int
ordinal):
|
new Enum《EnumTest》("MON",0);
new Enum《EnumTest》("TUE",1);
new Enum《EnumTest》("WED",2);
...
...
|
遍历、switch
等常用操作
对enum进行遍历和switch的操作示例代码:
|
public class Test {
public static void main(String[]
args) {
for (EnumTest
e : EnumTest.values()) {
System.out.println(e.toString());
}
System.out.println("----------------我是分隔线------------------");
EnumTest
test = EnumTest.TUE;
switch (test)
{
case MON:
System.out.println("今天是星期一");
break;
case TUE:
System.out.println("今天是星期二");
break;
//
... ...
default:
System.out.println(test);
break;
}
}
}
|
输出结果:
|
MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二
|
enum
对象的常用方法介绍
int compareTo(E
o)
比较此枚举与指定对象的顺序。
Class《E》 getDeclaringClass()
返回与此枚举常量的枚举类型相对应的
Class
对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static 《T
extends
Enum《T》》T valueOf(Class《T》enumType,
String name)
返回带指定名称的指定枚举类型的枚举常量。
|
public class Test {
public static void main(String[]
args) {
EnumTest
test = EnumTest.TUE;
//compareTo(E
o)
switch (test.compareTo(EnumTest.MON))
{
case -1:
System.out.println("TUE
在 MON 之前");
break;
case 1:
System.out.println("TUE
在 MON 之后");
break;
default:
System.out.println("TUE
与 MON 在同一位置");
break;
}
//getDeclaringClass()
System.out.println("getDeclaringClass():
" +
test.getDeclaringClass().getName());
//name()
和 toString()
System.out.println("name():
" + test.name());
System.out.println("toString():
" + test.toString());
//ordinal(),
返回值是从 0 开始
System.out.println("ordinal():
" + test.ordinal());
}
}
|
输出结果:
|
TUE
在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
|
给 enum
自定义属性和方法
给 enum 对象加一下 value 的属性和 getValue()
的方法:
|
package com.hmw.test;
public enum EnumTest {
MON(1),
TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
@Override
public boolean isRest()
{
return true;
}
},
SUN(0)
{
@Override
public boolean isRest()
{
return true;
}
};
private int value;
private EnumTest(int value)
{
this.value
= value;
}
public int getValue()
{
return value;
}
public boolean isRest()
{
return false;
}
}
|
|
public class Test {
public static void main(String[]
args) {
System.out.println("EnumTest.FRI
的 value = " +
EnumTest.FRI.getValue());
}
}
|
输出结果:
EnumSet,EnumMap
的应用
|
public class Test {
public static void main(String[]
args) {
//
EnumSet的使用
EnumSet《EnumTest》
weekSet = EnumSet.allOf(EnumTest.class);
for (EnumTest
day : weekSet) {
System.out.println(day);
}
//
EnumMap的使用
EnumMap《EnumTest,
String》 weekMap =
new EnumMap(EnumTest.class);
weekMap.put(EnumTest.MON,
"星期一");
weekMap.put(EnumTest.TUE,
"星期二");
//
... ...
for (Iterator《Entry《EnumTest,
String》》 iter = weekMap.entrySet().iterator();
iter.hasNext();) {
Entry《EnumTest,
String》 entry = iter.next();
System.out.println(entry.getKey().name()
+ ":" + entry.getValue());
}
}
}
|
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)