Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法
public enum Gender
{
MALE,FEMALE;
private String name;
public void setName(String name)
{
switch(this)
{
case MALE:
if(name.equals("男"))
{
= name;
}
else
{
System.out.println("参数错误");
return;
}
break;
case FEMALE:
if(name.equals("女"))
{
= name;
}
else
{
System.out.println("参数错误");
return;
}
break;
}
}
public String getName()
{
return ;
}
}
public class TestGender
{
public static void main(String[] args)
{
Gender g = Enum.valueOf(Gender.class,"FEMALE");
g.setName("女");
System.out.println(g + "代表:" + g.getName());
//此时设置 name 属性时将会提示参数错误码
g.setName("男");
System.out.println(g + "代表:" + g.getName());
}
}
对枚举类来说,应该设计成不可变类,因此上面的属性值不应该允许改变,这样是不安全的,因此对属性应使用final修饰符,必须在构造器里为这些属性指定初始值,因此应该为枚举类显式定义带参数的构造器MALE,FEMALE 这些枚举值代表枚举类的所有可能实例,所以MALE(参数),就等同于调用构造器,类实例(参数)
MALE("男"),FEMALE("女")这样的写法确实给人一种怪异的感觉
public enum Gender { //此处的枚举值必须调用对应构造器来创建 MALE("男"),FEMALE("女"); private final String name; //枚举类的构造器只能使用private修饰 private Gender(String name) { = name; } public String getName() { return ; } }
public class TestGender
{
public static void main(String[] args)
{
Gender g = Enum.valueOf(Gender.class,"FEMALE");
System.out.println(g + "代表:" + g.getName());
g = Enum.valueOf(Gender.class,"MALE");
System.out.println(g + "代表:" + g.getName());
}
}
现在客户端不再有修改枚举类属性的权力了,呵呵
枚举类还可以实现一个或多个接口,C#的枚举类不支持这种做法
public interface GenderDesc
{
void info();
}
public enum Gender implements GenderDesc
{
//此处的枚举值必须调用对应构造器来创建
MALE("男")
//花括号部分实际上是一个类体部分
{
public void info()
{
System.out.println("这个枚举值代表男性");
}
},
FEMALE("女")
{
public void info()
{
System.out.println("这个枚举值代表女性");
}
};
private final String name;
private Gender(String name)
{
= name;
}
}
当创建MALE和FEMALE两个枚举值时,后面又跟着一对花括号,括号里又包含一个info方法定义.括号部分实际是一个类体部分,当创始MALE,FEMALE枚举值时,并不是直接创建了Gender枚举类实例,而是相当于创建Gender的匿名子类实例.所以这个部分与匿名内部类语法大致相似.
编译生成三个文件Gender.class,Gender$1.class,Gender$2.class,和之前内部类的生成名字结构一样,证明了以上结论,MALE和FEMALE是Gender匿名子类的实例,而不是Gender类的实例
枚举类可包含抽象方法,当然这个C#也是不支持的
public enum Operation
{
PLUS
{
public double eval(double x,double y)
{
return x + y;
}
},
MINUS
{
public double eval(double x,double y)
{
return x - y;
}
},
TIMES
{
public double eval(double x,double y)
{
return x*y;
}
},
DIVIDE
{
public double eval(double x,double y)
{
return x/y;
}
};
//为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同的实现
public abstract double eval(double x,double y);
public static void main(String[] args)
{
System.out.println(Operation.PLUS.eval(3,4));
System.out.println(Operation.MINUS.eval(5,4));
System.out.println(Operation.TIMES.eval(5,4));
System.out.println(Operation.DIVIDE.eval(5,4));
}
}