ITEEDU

Java Gossip: 列举上的方法

定义列举型态基本上就像是在定义类别,定义列举型态时您也可以加入方法(Method),例如,您也许会想要为列 举值加上一些描述,而不是使用预设的toString()返回值来描述它。

OpConstants.java
public enum OpConstants {
	TURN_LEFT, TURN_RIGHT, SHOOT;

	public String getDescription() {
		switch(this.ordinal()) {
			case 0:
			return "向左转";
			case 1:
			return "向右转";
			case 2:
			return "射击";
			default:
			return null;
		}
	}
}

您可以使用下面这个程序来测试一下:

ShowEnum.java
public class ShowEnum {
	public static void main(String[] args) {
		for(OpConstants c : OpConstants.values()) {
			System.out.printf("%s%n\t%s%n",
			c, c.getDescription());
		}
	}
}

执行结果:

TURN_LEFT
         向左转
TURN_RIGHT
         向右转
SHOOT
         射击

列举型态即然是类别,那么您可以为它加上 建 构方法(Constructor)吗?答案是可以的,但是不得为公开(public),这是为了避免粗心的程序设计人员直接实例化它,一个不为公 开的建构方法可以作什么?来看看下面这个例子:

OpConstants.java
public enum OpConstants {
	TURN_LEFT("向左转"), TURN_RIGHT("向右转"), SHOOT("射击");
	private String description;
	OpConstants(String description) {
		this.description = description;
	}
	public String getDescription() {
		return description;
	}
}

在列举TURN_LEFT、TURN_RIGHT、SHOOT成员时,您一并指定描述给它,这个描述会在建构列举对象时使用,程 式中您将之设定给私用成员description,在使用getDescription()时将之返回,使用上面的ShowEnum,您可以得到相同的 显示结果。

与类别一样,在定义列举值时也可以一并实作 界面 (interface),例如:

IEnumDescription.java
public interface IEnumDescription {
	public String getDescription();
}

您可以使用这个接口规定每个实作该接口的列举值,必须传回一个描述列举值的字符串,例如:

OpConstants.java
public enum OpConstants implements IEnumDescription {
	TURN_LEFT("向左转"), TURN_RIGHT("向右转"), SHOOT("射击");
	private String description;
	OpConstants(String description) {
		this.description = description;
	}
	public String getDescription() {
		return description;
	}
}