因值而异的类实现?原文为 Value-Specific Class
Bodies,其实这个功能简单的说,实现时像是在使用匿名 内
部类(inner class) 来实现 Command
模式,它让您可以为每个枚举值定义各自的类本体与方法(Method)实现。
先来看看其中一种实现的方式,我们先声明接口:
public interface IEnumDescription { public String getDescription(); }
这个getDescription()方法,我们希望每个枚举的实例实现自己的方法(而不是像 枚举上的方法 所介绍的,在定义枚举时统一实现一个getDescription()方法)例如:
public enum OpConstants implements IEnumDescription { TURN_LEFT { public String getDescription() { return "向左转"; } }, // 记得这边的枚举值分隔 , TURN_RIGHT { public String getDescription() { return "向右转"; } }, // 记得这边的枚举值分隔 , SHOOT { public String getDescription() { return "射击"; } }; // 记得这边的枚举值结束 ; }
{ 与 }
之间是类本体,您可以在当中如何定义类一样声明field成员或实现方法。TURN_LEFT、TURN_RIGHT与SHOOT三个
OpConstants的枚举实例,它们各自在本体(Body) { 与 }
之间实现了自己的getDescription()方法,而不是像上个主题中统一实现在OpConstants中,再将上个主题中的程序列出,比较一下两
者的不同:
public enum OpConstants implements IEnumDescription { TURN_LEFT("向左转"), TURN_RIGHT("向右转"), SHOOT("射击"); private String description; OpConstants(String description) { this.description = description; } // 这边的实现对三个枚举值都一样 public String getDescription() { return description; } }
写个测试程序看看结果:
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
射击
|
这个例子是将因值而异的类实现用在返回枚举值描述上,您可以依相同的方式,为每个枚举值加上一些各自的方法实现,而调用的接口是统一的。
您也可以运用抽象方法来改写上面的OpConstants,例如:
public enum OpConstants { TURN_LEFT { public String getDescription() { return "向左转"; } }, TURN_RIGHT { public String getDescription() { return "向右转"; } }, SHOOT { public String getDescription() { return "射击"; } }; // 声明个抽象方法 public abstract String getDescription(); }
执行结果是一样的;基本上定义接口方法或抽象方法,是为了知道对象的操作方法,这样您才能去操作这个对象。 |