我是靠谱客的博主 老实钢笔,最近开发中收集的这篇文章主要介绍多路分发-枚举类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

如果一个系统要分析和执行数学表达式,我们可能会声明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;
	}
	@Override
	public 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: DRAW
SCISSORS vs ROCK: LOSE
SCISSORS vs ROCK: LOSE
SCISSORS vs ROCK: LOSE
PAPER vs SCISSORS: LOSE
PAPER vs PAPER: DRAW
PAPER vs SCISSORS: LOSE
ROCK vs SCISSORS: WIN
...

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

最后

以上就是老实钢笔为你收集整理的多路分发-枚举类型的全部内容,希望文章能够帮你解决多路分发-枚举类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部