ITEEDU

因值而异的类实作(Value-Specific Class Bodies)

因值而异的类实作?原文为 Value-Specific Class Bodies,其实这个功能简单的说,实作时像是在使用匿名 内 部类别(inner class) 来实现 Command 模式,它让您可以为每个列举值定义各自的类本体与方法(Method)实作。

先来看看其中一种实现的方式,我们先宣告接口:

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

这个getDescription()方法,我们希望每个列举的实例实作自己的方法(而不是像 列 举上的方法 所介绍的,在定义列举时统一实作一个getDescription()方法)例如:

OpConstants.java
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中,再将上个主题中的程序行出,比较一下两 者的不同:

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;
	}
}

写个测试程序看看结果:

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
           射击

这个例子是将因值而异的类实作用在返回列举值描述上,您可以依相同的方式,为每个列举值加上一些各自的方法实作,而呼叫的接口是统一的。

您也可以运用抽象方法来改写上面的OpConstants,例如:

OpConstants.java
public enum OpConstants {
	TURN_LEFT {
		public String getDescription() {
			return "向左转";
		}
	},
	TURN_RIGHT {
		public String getDescription() {
			return "向右转";
		}
	},
	SHOOT {
		public String getDescription() {
			return "射击";
		}
	};
	// 宣告个抽象方法
	public abstract String getDescription();
}

执行结果是一样的;基本上定义接口方法或抽象方法,是为了知道对象的操作方法,这样您才能去操作这个对象。