`
racingbird
  • 浏览: 23355 次
  • 性别: 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;} ``` 这是...

    Enum的用法

    Enum的用法Enum的用法Enum的用法Enum的用法

    Java中的Enum的使用与分析

    Java中的Enum的使用与分析

    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 结构分析源码

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

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

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

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

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

    enumdisk1.exe

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

    enum 简单使用例子

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

    Laravel开发-laravel-enum

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

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    Python库 | enum-0.4.7.tar.gz

    Python库是开发者在编程时经常会使用到的重要工具,它们提供了丰富的功能,可以帮助我们更...在使用`enum-0.4.7.tar.gz`压缩包时,你可以按照`README`文件的指示进行安装和测试,以便在项目中充分利用`enum`库的功能。

    enum类型被intent所携带时各种情况的示例代码

    2. **使用String值传递**:除了ordinal,每个enum实例还有一个名称(即定义时的标识符)。可以将enum的名称作为String传递,然后在接收端通过反射机制创建对应的enum实例。 ```java public enum MyEnum { VALUE1(...

    java enum 枚举 学习资料

    2. 枚举类的特点 枚举类中所有的构造器是 private 的,外部程序不能够创建枚举类的实例。枚举类中可以显式的指明调用哪个构建器,如 MEMBER 和 MEMBER() 这两种元素列表声明是等价的,都是调用默认的构建器,而 ...

    enum类型重定义解决方法

    常见的enum类型重定义的解决方法,清晰明了。

    java枚举类型enum的使用

    java枚举类型的定义使用介绍,还有示例。

Global site tag (gtag.js) - Google Analytics