Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法
public enum Gender
{
MALE,FEMALE;
private String name;
public void setName(String name)
{
switch(this)
{
case MALE:
if(name.equals("男"))
{
this.name = name;
}
else
{
System.out.println("参数错误");
return;
}
break;
case FEMALE:
if(name.equals("女"))
{
this.name = name;
}
else
{
System.out.println("参数错误");
return;
}
break;
}
}
public String getName()
{
return this.name;
}
}
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("女")这样的写法确实给人一种怪异的感觉
枚举类还可以实现一个或多个接口,C#的枚举类不支持这种做法
public enum Gender { //此处的枚举值必须调用对应构造器来创建 MALE("男"),FEMALE("女"); private final String name; //枚举类的构造器只能使用private修饰 private Gender(String name) { this.name = name; } public String getName() { return this.name; } }现在客户端不再有修改枚举类属性的权力了,呵呵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()); } }
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) { this.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)); } }