第 11章
枚举类型
– 常数设置与枚举类型
– 定义枚举类型常数设置
可使用接口来定义操作时所需的共享常数
public interface ActionConstants {
public static final int TURN_LEFT = 1;
public static final int TURN_RIGHT = 2;
public static final int SHOT = 3;
}
常数设置
public void someMethod() {
....
doAction(ActionConstants.TURN_RIGHT);
....
}
public void doAction(int action) {
switch(action) {
case ActionConstants.TURN_LEFT:
System.out.println("向左转 ");
break;
case ActionConstants.TURN_RIGHT:
System.out.println("向右转 ");
break;
case ActionConstants.SHOOT:
System.out.println("射击 ");
break;
}
}
常数设置
使用类别来宣告的话
如果常数只是在类别内部使用的话,就宣告其为,private”或是,protected”就可以了
– 宣告为类别外可取用的常数,通常是与类别功能相依的常数
public class CommandTool {
public static final String ADMIN = "onlyfun.caterpillar.admin";
public static final String DEVELOPER =
"onlyfun.caterpillar.developer";
public void someMethod() {
//,...
}
}
枚举类型入门
要定义枚举类型是使用,enum”关键词
枚举类型骨子里就是一个类别,所以您编译完成后,会产生一个 Action.class档案
public enum Action {
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
枚举类型入门
public class EnumDemo {
public static void main(String[] args) {
doAction(Action.TURN_RIGHT);
}
public static void doAction(Action action) {
switch(action) {
case TURN_LEFT:
System.out.println("向左轉 ");
break;
case TURN_RIGHT:
System.out.println("向右轉 ");
break;
case SHOOT:
System.out.println("射擊 ");
break;
}
}
}
枚举类型入门
doAction()参数列的类型是 Action
如果对 doAction()方法输入其它类型的自变量,编译程序会回报错误
如果您在 "switch"中加入了不属于 Action中枚举的值,编译程序也会回报错误枚举类型入门...
public static void doAction(Action action) {
switch(action) {
case TURN_LEFT:
System.out.println("向左转 ");
break;
case TURN_RIGHT:
System.out.println("向右转 ");
break;
case SHOOT:
System.out.println("射击 ");
break;
case STOP,//Action中没有枚举这个值
System.out.println("停止 ");
break;
}
}
...
unqualified enumeration constant name required case STOP:
枚举类型入门
可以在一个独立的档案中宣告枚举值,或是在某个类别中宣告枚举成员
private enum InnerAction {TURN_LEFT,TURN_RIGHT,SHOOT};
public static void main(String[] args) {
doAction(InnerAction.TURN_RIGHT);
}
public static void doAction(InnerAction action) {

}
枚举类型入门
枚举类型本质上还是个类别
范例 11.5的枚举宣告方式有些像在宣告「内部类别」 ( Innerclass)
编译产生 EnumDemo2$InnerAction.class
与 EnumDemo2$1.class
深入枚举类型
定义枚举类型时其实就是在定义一个类别
只不过很多细节由编译程序帮您补齐了
某些程度上 "enum"关键词的作用就像是
"class"或 "interface"
定义出来的类型是继承自 java.lang.Enum类别深入枚举类型
枚举的成员
– 预设为,final”,所以无法改变常数名称所设定的值
– 也是,public”且,static”的成员,可以透过类别名称直接使用它们深入枚举类型
Object继承下来
– toString()方法被重新定义了,可以让您直接取得枚举值的字符串描述
– values()方法可以让您取得所有的枚举成员实例,并以数组方式传回
– 静态 valueOf()方法可以让您将指定的字符串尝试转换为枚举实例
– 可以使用 compareTo()方法来比较两个枚举对象在枚举时的顺序深入枚举类型
定义枚举类型时也可以定义方法
public enum DetailAction {
TURN_LEFT,TURN_RIGHT,SHOOT;
public String getDescription() {
switch(this.ordinal()) {
case 0:
return"向左转 ";
case 1:
return"向右转 ";
case 2:
return"射击 ";
default:
return null;
}
}
}
深入枚举类型
可以为枚举加上建构方法( Constructor)
– 不得为公开的( public)建构方法
– 避免粗心的程序人员直接对枚举类型实例化
public enum DetailAction2 {
TURN_LEFT("向左转 "),TURN_RIGHT("向右转 "),SHOOT("射擊 ");
private String description;
//不公开的建构方法
private DetailAction2(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
深入枚举类型
在定义枚举值时也可以一并实作接口
public interface IDescription {
public String getDescription();
}
public enum DetailAction3implements IDescription {
TURN_LEFT("向左转 "),TURN_RIGHT("向右转 "),SHOOT("射击 ");
private String description;
//不公开的建构方法
private DetailAction3(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
Value-Specific Class Bodies
public enum MoreActionimplements IDescription {
TURN_LEFT {
//实作接口上的方法
public String getDescription() {
return"向左转 ";
}
},//记得这边的枚举值分隔使用,
TURN_RIGHT {
//实作接口上的方法
public String getDescription() {
return"向右转 ";
}
},//记得这边的枚举值分隔使用,
SHOOT {
//实作接口上的方法
public String getDescription() {
return"射击 ";
}
}; //记得这边的枚举值结束使用 ;
}
Value-Specific Class Bodies
public enum MoreAction2 {
TURN_LEFT {
//实作抽象方法
public String getDescription() {
return"向左转 ";
}
},//记得这边的枚举值分隔使用,
TURN_RIGHT {
//实作抽象方法
public String getDescription() {
return"向右转 ";
}
},//记得这边的枚举值分隔使用,
SHOOT {
//实作抽象方法
public String getDescription() {
return"射击 ";
}
}; //记得这边的枚举值结束使用 ;
public abstract String getDescription();
}