多路分发-枚举类型

来源:互联网 发布:ubuntu安装到u盘上 编辑:程序博客网 时间:2024/06/10 18:17

这个名词不太理解,直接引用书上的解释例子

如果一个系统要分析和执行数学表达式,我们可能会声明Number.plus(Number)和Number.multiple(Number)等等。其中Number是各种数字对象的超类。当使用a.plus(b)的时候,并不知道a或b的确切类型,如何能保证正确的交互呢?

java只支持单路分发,如果要执行上面的操作包含了不止一个类型未知的对象时,那么java的动态绑定机制只能处理其中一个类型。所以必须自己来判定其他的类型。


书上用enum实现多路分发的例子

import static enumerated.Outcome.*;public enum RoShamBo implements Competitor<RoShamBo>{PAPER(DRAW, LOSE, WIN),//如果自己是出布,对方出(布、剪刀和石头)输赢分别是(平局,输,赢)SCISSORS(WIN, DRAW, LOSE),ROCK(LOSE, WIN, DRAW);private Outcome vPaper, vScissors, vRock;//构造函数接受三个参数 依次是 布、剪刀和石头RoShamBo(Outcome paper, Outcome scissors, Outcome rock) {this.vPaper = paper;this.vScissors = scissors;this.vRock = rock;}@Overridepublic Outcome complete(RoShamBo comptitor) {switch (comptitor) {case PAPER:return vPaper;case SCISSORS:return vScissors;case ROCK:return vRock;default:return null;}}public static void main(String[] argv) {play(RoShamBo.class, 20);}//以下部分可以单独写为工具方法/** * <T extends Competitor<T>>规定传入的参数必须是Competitor<T>类型 * 这个不是返回值 这个方法是void的,没有返回 */public static <T extends Competitor<T>> void match(T a, T b) {System.out.println(a + " vs " + b + ": " + a.complete(b));}/** * 随机产生指定数量个场景(对象)进行游戏 * 调用了Enums工具方法Enums.random * <T extends Enum<T> & Competitor<T>> 规定传入的参数必须同时是Enum<T>和Competitor<T>类型 * @param rsbClass 用来比赛的对象 * @param size 数量 */public static <T extends Enum<T> & Competitor<T>> void play(Class<T> rsbClass, int size) {for(int i = 0; i < size; i++) {match(Enums.random(rsbClass), Enums.random(rsbClass));}}}
输出结果

ROCK vs ROCK: DRAWSCISSORS vs ROCK: LOSESCISSORS vs ROCK: LOSESCISSORS vs ROCK: LOSEPAPER vs SCISSORS: LOSEPAPER vs PAPER: DRAWPAPER vs SCISSORS: LOSEROCK vs SCISSORS: WIN...

代码倒是可以理解,很有意思的一段代码。但是对多路分发这个,还不是太理解。。

0 0
原创粉丝点击