`
racingbird
  • 浏览: 23695 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多路分发2[使用enum分发]

 
阅读更多

直接将RoShamBo1.java翻译为基于enum的版本是有问题的,因为enum实例不是类型,

不能将enum实例作为参数的类型,所以无法重载eval方法。

 

利用构造器来初始化每个enum实例,并以"一组"结果作为参数。二者放在一块,形成了

类似查询表的结构。

 

public interface Competitor<T extends Competitor<T>>
{
	Outcome compete(T competitor);
}

public class RoShamBo
{
	public static <T extends Competitor<T>>
		void match(T a, T b){
		System.out.println(a +" vs. "+ b +": "+ a.compete(b));
	}

	public static <T extends Enum<T> & Competitor<T>>
		void play(Class<T> rsbClass, size){
		
		for(int i=0; i<size; i++){
			match(Enums.random(rsbClass), Enums.random(rsbClass));
		}
	}
}

public enum RoshamBo2 implements Competitor<RoshamBo2>{

	PAPER(DRAW, LOSE, WIN),
	SCISSORS(WIN, DRAW, LOSE),
	ROCK(LOSE, WIN, DRAW);

	private Outcome vPAPER, vSCISSOR, vROCK;

	RoshamBo2(Outcome paper, Outcome scissor, Outcome rock){
		this.vPaper = paper;
		this.vSCISSORS = scissors;
		this.vROCK = rock;
	}

	public Outcome compete(RoshamBo2 it){
		switch(it){
			default:
				case PAPER : return vPAPER;
				case SCISSOR : return vSCISSORS;
				case ROCK : return vROCK;
		}
	}
}

 

compete()方法中, 一旦2种类型都被确定了,唯一的返回的结果是Outcome。

ranked还可能需要调用其他的方法,设置是调用在构造器中指定的某个明路对象上的

方法。

 

在RoShamBo1.java中, 2次分发多是通过实际的方法调用实现,而例子中,只有一次

分发是实际的方法调用。第二个分发使用的是switch,不过这样做是安全的,因为

enum限制了switch语句的选择分支。

分享到:
评论

相关推荐

    Options:有时在某些情况下,您想在OptionSet中使用Enum或希望Enum由Raw的Int类型支持,但同时也具有String标签

    目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将EnumSet转换为Enum数组使用...

    Java Enum使用Demo源码

    本篇将通过"Java Enum使用Demo源码"深入探讨Java枚举的用法。 首先,枚举在Java中是一个类,可以通过`enum`关键字来声明。例如,我们可以创建一个表示星期的枚举类型: ```java public enum WeekDay { MONDAY, ...

    Enum汇总大全详细讲解

    枚举(Enum)在Java中是一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的常量表示方式。以下是对Enum的详细讲解: 1. **基本枚举定义**: ```java enum Color {BLUE, RED, GREEN;} ``` 这是...

    Java中的Enum的使用与分析

    ### Java中的Enum使用与分析 #### 一、概述 在Java编程语言中,`Enum`是一种特殊的数据类型,用于表示一组固定的常量值。通过枚举(`enum`),开发者可以更加直观地定义一系列预定义的值,并为这些值提供类型安全...

    java enum 枚举的spring boot2.x完美实现demo源码

    综上所述,`java enum 枚举的spring boot2.x完美实现demo源码`示例主要展示了如何在Spring Boot 2.x项目中使用枚举类型,包括枚举的定义、属性和方法的添加,以及如何在实际业务场景中应用枚举,如与数据库的交互和...

    Enum的用法

    4. **使用私有构造函数**:虽然`Enum`禁止公开构造函数,但可以定义私有构造函数并在枚举体内部使用,以便为枚举值提供额外的信息或状态,如描述信息: ```java public enum Color { Red("This is Red"), Green...

    Laravel开发-enum

    2. **创建Laravel Enum** 在Laravel中,我们通常创建一个enum类来表示枚举。首先,通过`php artisan make:enum UserRole`命令创建一个名为UserRole的enum。这个命令将在app/Enums目录下生成一个新文件,里面包含了...

    Java enum的用法详解

    在上面的示例中,我们使用 enum 来定义一个 `Signal` 枚举类型,并在 `TrafficLight` 类中使用 switch 语句来处理不同的信号状态。 用法三:添加新方法 如果我们想要在 enum 中添加新的方法,那么必须在 enum 实例...

    ENUM softphone 安装使用及SDK说明

    2. ENUM介绍与ENUM过程 ENUM是E.164电话号码映射协议,通过DNS系统将电话号码转换成域名。例如,电话号码+43 1 5056416经过以下步骤转换: - 清除非数字字符:24315056416 - 翻转数字顺序:6146505134 - 插入点分隔...

    enum 结构分析源码

    在这个“enum 结构分析源码”资源中,我们主要关注的是C语言中的枚举使用和实现。C语言中的enum并不是一种真正的类型,而是对整型变量的一种别名,它提供了更易读的常量名称。 首先,我们来看`enum.c`这个源文件。...

    enum类型重定义解决方法

    在编程中,`enum`(枚举)类型是用来定义一组命名的整数常量,它在C++中被广泛使用。然而,在某些情况下,我们可能会遇到`enum`类型的重定义问题,这通常发生在包含不同库或者头文件时,因为这些库可能已经定义了...

    C++中枚举类型(enum)

    enum box box2; ``` 也可以在同一行定义多个变量: ```cpp enum { pencil, pen } box, box2; ``` #### 显式指定枚举元素的值 如果需要为枚举元素指定具体的值,可以在定义时直接指定: ```cpp enum box { ...

    php-enum, PHP Enum实现灵感来自 SplEnum.zip

    php-enum, PHP Enum实现灵感来自 SplEnum PHP enum 实现来自 SplEnum 为什么?首先,SplEnum 并不集成到PHP中,你必须单独安装它。使用 enum 而不是类常量提供了以下优点:你可以键入提示: function setAction(Ac

    Python中的枚举类型:使用`enum`模块的深入指南

    在Python 3.4中,引入了enum模块,它提供了一个Enum类,使得定义和使用枚举类型变得简单而强大。本文将详细介绍如何在Python中使用enum模块定义枚举,包括枚举的基础概念、定义方法、使用场景以及高级应用。 Python...

    enumdisk1.exe

    用于枚举磁盘设备的 Enumdisk 示例

    enum 简单使用例子

    本文将深入探讨`enum`的简单使用方法以及如何结合委托(delegate)进行应用。 首先,我们来看如何声明一个枚举。在C#中,你可以使用`enum`关键字来创建一个新的枚举类型。下面是一个简单的例子: ```csharp public...

    Laravel开发-laravel-enum

    Laravel Enum库是为Laravel应用程序设计的一个扩展,它允许开发者使用枚举类型来替代传统的常量或字符串,从而使得业务逻辑更清晰,减少错误的可能性。下面将详细探讨Laravel Enum的使用、优点以及如何在项目中实现...

    java的Enum

    ENUM_VALUE1, ENUM_VALUE2, ENUM_VALUE3, ...; } ``` 其中`EnumName`是枚举类型的名称,`ENUM_VALUE1`, `ENUM_VALUE2`等是枚举常量。这些常量默认是公有的、静态的和最终的。 **示例代码**: ```java enum Color...

Global site tag (gtag.js) - Google Analytics