C++中定义枚举的时候可以直接指定枚举项的值,如:"enum {MAX_LENGTH = 255};"。其实Java也可以,今天学到了这种语法。C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下:
- enum FruitEnum {
- APPLE(1), ORANGE(2); //调用构造函数来构造枚举项
- private int value = 0;
- private FruitEnum(int value) { //必须是private的,否则编译错误
- this.value = value;
- }
- public static FruitEnum valueOf(int value) { //手写的从int到enum的转换函数
- switch (value) {
- case 1:
- return APPLE;
- case 2:
- return ORANGE;
- default:
- return null;
- }
- }
- public int value() {
- return this.value;
- }
- }
- public static void main(String[] args) {
- System.out.println(FruitEnum.APPLE.value()); // 1
- System.out.println(FruitEnum.ORANGE.value()); // 2
- System.out.println(FruitEnum.valueOf(1)); // FruitEnum.APPLE
- System.out.println(FruitEnum.valueOf(2)); // FruitEnum.ORANGE
- }
如果枚举项的值从0开始递增满足需要的话,那就简单了:
- enum MyEnum{
- FIRST_ELEMENT,
- SECOND_ELEMENT,
- }
- public static void main(String[] args) {
- System.out.println(MyEnum.FIRST_ELEMENT.ordinal());
- System.out.println(MyEnum.SECOND_ELEMENT.ordinal());
- System.out.println(MyEnum.values()[0]); //MyEnum.FIRST_ELEMENT
- System.out.println(MyEnum.values()[1]); //MyEnum.SECOND_ELEMENT
- }
再举一个例子
public class demo05 {
/**
* @param args
*/
enum Names{
JERRY("lead guitar"){ //给构造函数传参
public String sings(){ //特定常量的内容,把它们当做几本enum方法的覆盖,覆盖sing()
return "plaintively";
}
},
BOBBY("rhythm guitar"){
public String sings(){
return "hoarsely";
}
},
PHIL("bass");
private String instrument;
private Names(String instrument) { //enum的构造函数,会对每个生命的enum值执行一次(此例子中运行3次)
// TODO Auto-generated constructor stub
this.instrument=instrument;
}
public String getInstrument(){
return this.instrument;
}
public String sings(){
return "occasionally";
}
}
public static void main(String[] args) {
for(Names n:Names.values()){
System.out.print(n);
System.out.print(", instrument: "+n.getInstrument());
System.out.println(", sings: "+n.sings());
}
}
}