定义列举型态基本上就像是在定义类别,定义列举型态时您也可以加入方法(Method),例如,您也许会想要为列 举值加上一些描述,而不是使用预设的toString()返回值来描述它。
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; } } }
您可以使用下面这个程序来测试一下:
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),这是为了避免粗心的程序设计人员直接实例化它,一个不为公 开的建构方法可以作什么?来看看下面这个例子:
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),例如:
public interface IEnumDescription { public String getDescription(); }
您可以使用这个接口规定每个实作该接口的列举值,必须传回一个描述列举值的字符串,例如:
public enum OpConstants implements IEnumDescription { TURN_LEFT("向左转"), TURN_RIGHT("向右转"), SHOOT("射击"); private String description; OpConstants(String description) { this.description = description; } public String getDescription() { return description; } }