一、枚举类型——使用枚举类型分发

news2024/11/23 13:39:05

如果将 RoShamBo1.java 直接转换为基于枚举的实现版本,则会出现问题。因为枚举实例并不是类型,所以无法重载 eval() 方法,你无法将枚举实例作为参数类型。不过,还有别的方法可以利用枚举来实现多路分发。

一种方法是通过构造方法初始化每个枚举实例,并以一组结果作为参数,最终组成类似查询表的结构:

RoShamBo2.java

import static enums.TEST0006.Outcome.*;

public enum RoShamBo2 implements Competitor<RoShamBo2> {
    PAPER(DRAW, LOSE, WIN),
    SCISSORS(WIN, DRAW, LOSE),
    ROCK(LOSE, WIN, DRAW);
    private Outcome vPAPER, vSCISSORS, vROCK;

    RoShamBo2(Outcome paper,Outcome scissors, Outcome rock) {
        this.vPAPER = paper;
        this.vSCISSORS = scissors;
        this.vROCK = rock;
    }

    @Override
    public Outcome compete(RoShamBo2 it) {
        switch (it) {
            default:
            case PAPER:
                return vPAPER;
            case SCISSORS:
                return vSCISSORS;
            case ROCK:
                return vROCK;
        }
    }

    public static void main(String[] args) {
        RoShamBo.play(RoShamBo2.class, 20);
    }
}

Competitor.java

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

Outcome.java

public enum Outcome {WIN, LOSE, DRAW}

RoShamBo.java

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, int size) {
        for (int i = 0; i < size; i++) {
            match(Enums.random(rsbClass), Enums.random(rsbClass));
        }
    }
}

Enums.java

import java.util.Random;

public class Enums {
    private static Random rand = new Random(47);

    public static <T extends Enum<T>> T random(Class<T> ec) {
        return random(ec.getEnumConstants());
    }

    public static <T> T random(T[] values) {
        return values[rand.nextInt(values.length)];
    }
}

运行结果如下:

在这里插入图片描述

在 compete() 方法中,一旦两个类型都被确定了,那么唯一的动作就是返回得到的 outcome。然而,你也可以调用其他方法,甚至是(比如)构造方法中分配的命令对象中的方法。

RoShamBo2.java 比最初的版本更为简单明了,因此也更容易理解。注意,你仍然在使用两路分发来确定这两个对象的类型。在 RoShamBo1.java 中,两路的分发都是通过虚拟方法调用的。在这里,只有第一次分发使用了虚拟方法调用,第二次分发用的是 switch 。不过这样做是安全的,因为枚举限制了 switch 中的状态可选范围。

用来操作枚举的代码是独立的,因此也可以放到其他例子中使用。首先,Competitor(竞争者)接口定义了一个和另一个 Competitor 竞争的类型:

在这里插入图片描述

然后我们定义了两个静态方法(使用静态是为了避免显式地指定参数类型)。首先,match() 方法中调用了 compete() 方法,让两个 Competitor 竞争,可以看到此处类型参数只需要是 Competitor。但是在 play() 方法中,类型参数必须同时是 Enum(因为要放在Enuns.random()中使用)和 Competitor(因为要传给match()):

在这里插入图片描述

play() 方法没有将类型参数 T 作为返回值,因此,似乎你应该在 Class 中用通配符来取代主要的参数声明。然而通配符无法继承多个基类,因此我们必须使用上面的表达式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战:SonarQube平台安装配置-2023.6.24(安装成功)(docker方式)

实战&#xff1a;SonarQube平台安装配置-2023.6.24(安装成功)(docker方式) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 sonarqube:9.9.0-community (docker方式部署) SonarScanner 4.8.0.2856 (部署在宿主机上)实验软件 链接&…

开关电源-PFC驱动电路的工作原理

PFC驱动电路的工作原理 由于PFC的控制地和MOS管组成的双向开关的源极不共地&#xff0c;因此需要解决开关管浮地驱动问题。 图2 驱动电路图 电路图说明&#xff1a; PFCPWM是DSP的PWM信号&#xff1b;VCC_4V和AGND是DSP侧的电源和控制地&#xff1b;Vccp_14V和AGND_DRV是MO…

echarts 的 一个图表容器,使用grid存放多个折线图,并配置x轴联动

效果图 配置参数 // prettier-ignore const data [["2000-06-05", 116], ["2000-06-06", 129], ["2000-06-07", 135], ["2000-06-08", 86], ["2000-06-09", 73], ["2000-06-10", 85], ["2000-06-11",…

开关电源- 用PFC拓扑电路对比

用PFC拓扑电路对比 最基本的有桥boost PFC电路 有桥boostPFC电路是最基本的电路&#xff0c;就不叙述了。 双Boost无桥PFC 双boost无桥拓扑的优点是使用功率元件比较少, 两个管子可以一起驱动, 这简化了驱动电路的设计, 同时让直接使用传统APFC的控制芯片成为可能.但是这种拓扑…

3.41 - haas506与esp8266-01s的串口通信(TCP透传)

haas506与esp8266-01s的串口通信 PC端调试wifi模块1.接线(与电脑通信)2.模式案例3.指令演示 开发板与wifi模块通信1.接线(TTL串口通信)2.代码测试 PC端调试wifi模块 esp8266-01s 1.接线(与电脑通信) 与电脑通信时引脚连接&#xff0c;wifi模块需要稳定3.3v供电&#xff0c;…

一个618项目的复盘总结反思

一、前言 618期间上线一个活动项目。但上线不顺利&#xff0c;当天就出现了性能问题&#xff0c;接口超时&#xff0c;用户无法打开网页&#xff0c;最后不得的临时下线。花了三天两夜&#xff0c;重构了后台核心代码&#xff0c;才让活动进行下去。 回头看了一下自己的时间记…

【零基础入门学习Python---Python条件和循环语句】

&#x1f680; Python &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

OpenCV下载、环境变量配置

https://sourceforge.net/projects/opencvlibrary/files/ 选择合适的版本下载即可 这里使用opencv-3.1.0.exe执行 将需要bin目录加入到环境变量Path D:\opencv\31\opencv\build\x64\vc14\bin #include<opencv2/opencv.hpp> #include <iostream> using namespace …

【学习日记2023.6.25】之ElasticSearch搜索引擎

文章目录 分布式搜索引擎1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2 ELK技术栈1.1.3 elasticsearch和lucene1.1.4 为什么不是其他搜索技术&#xff1f;1.1.5 总结 1.2 倒排索引1.2.1 正向索引1.2.2 倒排索引1.2.3 正向和倒排 1.3 es的一些概念1.3.1 文档和字…

[Web程序设计]实验: Servlet基础应用

一、实验目的 &#xff08;1&#xff09;掌握java web应用的基础和核心知识&#xff1a;servlet。 &#xff08;2&#xff09;理解servlet的具体使用。 二、实验内容 &#xff08;1&#xff09;编写一个servlet&#xff0c;实现统计网站被访问次数的功能&#xff1b; &…

SpringBoot 集成测试主要组件及其特点

SpringBoot 集成测试主要组件及其特点 随着SpringBoot的流行&#xff0c;集成测试也变得越来越重要。SpringBoot提供了一些主要组件来支持集成测试&#xff0c;本文将介绍这些组件及其特点。 1. Spring Test Spring Test是Spring框架提供的测试工具集&#xff0c;其主要目的是…

langchain源码阅读系列(二)之数据接入层

原文首发于博客文章OpenAI 文档解读 LangChain 主体分为 6 个模块&#xff0c;分别是对&#xff08;大语言&#xff09;模型输入输出的管理、外部数据接入、链的概念、&#xff08;上下文记忆&#xff09;存储管理、智能代理以及回调系统&#xff0c;通过文档的组织结构&#x…

将数组中所有元素依次向右或向左移动指定的n个位置 从右侧移出的元素从左侧补入 从左侧移出的元素从右侧补入 numpy.roll()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中所有元素依次向右 或向左移动指定的n个位置 从右侧移出的元素从左侧补入 从左侧移出的元素从右侧补入 numpy.roll() [太阳]选择题 请问关于以下代码的最后输出正确的是&#xff1f;…

chatgpt赋能python:Python编程:如何赚取高薪?

Python编程&#xff1a;如何赚取高薪&#xff1f; Python语言是一门被广泛使用的编程语言&#xff0c;因其简单易学&#xff0c;而在软件开发、数据分析、机器学习及人工智能等领域中得到了广泛应用。随着这些领域的不断发展&#xff0c;对Python开发人才的需求也越来越高涨。…

基于Java彩妆小样售卖商城的设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Python爬虫之数据解析技术

Python爬虫需要数据解析的原因是&#xff0c;爬取到的网页内容通常是包含大量标签和结构的HTML或XML文档。这些文档中包含所需数据的信息&#xff0c;但是需要通过解析才能提取出来&#xff0c;以便后续的处理和分析。 以下是一些使用数据解析的原因&#xff1a; 数据提取&…

基于Java高校实验室管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

通过Web3Js网页代码在MetaMask辅助下完成用户发送操作

上文 html通过web3JS 获取当前连接的区块链信息和账号信息在html中通过 Web3.0.js 获取了本地虚拟的区块链信息 和通过 公钥获取了账号的 ETH 那么 之前我们文章 Web3通过 MetaMask简单演示对ganache虚拟环境账号进行管理操作演示了通过MetaMask在本地发送ETH给其他账号 那么 …

springboot+vue基于java的健美操体操舞蹈视频评分系统

健美操评分系统采用B/S架构&#xff0c;数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写&#xff0c;使用了springboot框架。该系统从三个对象&#xff1a;由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页&#xff0c;个人中心&#xff0c;裁判员管理…

【Linux】遇事不决,可先点灯,LED驱动的进化之路---2

【Linux】遇事不决&#xff0c;可先点灯&#xff0c;LED驱动的进化之路---2 前言&#xff1a; 一、Pinctrl子系统重要概念 1.1 重要概念 1.1.1 pin controller 1.1.2 client device 1.1.3 补充概念 二、GPIO子系统重要概念 2.1 在设备树指定GPIO引脚 2.2 在驱动代码中…