枚举应用篇
时间:2019-10-09
本文章向大家介绍枚举应用篇,主要包括枚举应用篇使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
《Java编程思想》这本书已经看到19章枚举,之前的很多难点被我略过了。在此章学到了新概念,多路分发。先说说单路分发: Java只支持单路分发,即如果要执行的操作包含多个不确定的类型类型对象时,Java只能处理其中一个的类型。N个未知类型需要N个方法调用以确定其类型即分发。所以编程思想中的多路分发严格讲应该叫“伪多路分发”即多次单路分发。单路分发实质上是多态特性的一种体现。
举个梨子:例如有A、B、C、三种类型a.compete(b),a、b的类型未知,执行此句时只能确定a的类型
代码为证:
package com.houjun.enum1; import java.util.Random; /** * @Author: HouJun * @Date: 2019/10/8 17:29 * @Description: 多路分发例子 * @version: 1.0 */ enum Outcome { WIN, LOSE, DRAW; } interface Item { // Outcome compete(Item it);//完成方法 Outcome eval(Paper p); Outcome eval(Scissors s); Outcome eval(Rock r); Outcome eval(Item r); } class Paper implements Item { // @Override // public Outcome compete(Item item) { // return item.eval(this); // } @Override public Outcome eval(Paper p) { return Outcome.DRAW; } @Override public Outcome eval(Scissors s) { return Outcome.LOSE; } @Override public Outcome eval(Rock r) { return Outcome.WIN; } @Override public Outcome eval(Item r) { System.out.println(r.getClass().getName()); System.out.println("c"); return null; } } class Scissors implements Item { // @Override // public Outcome compete(Item it) { // return it.eval(this); // } @Override public Outcome eval(Paper p) { return Outcome.LOSE; } @Override public Outcome eval(Scissors s) { return Outcome.DRAW; } @Override public Outcome eval(Rock r) { return Outcome.WIN; } @Override public Outcome eval(Item r) { System.out.println(r.getClass().getName()); System.out.println("b"); return null; } } class Rock implements Item { // @Override // public Outcome compete(Item it) { // return it.eval(this); // } @Override public Outcome eval(Paper p) { return Outcome.LOSE; } @Override public Outcome eval(Scissors s) { return Outcome.WIN; } @Override public Outcome eval(Rock r) { return Outcome.DRAW; } @Override public Outcome eval(Item r) { // if ( r instanceof Rock){ // return this.eval(new Rock()); // } // if ( r instanceof Scissors){ // return this.eval(new Scissors()); // }if ( r instanceof Paper){ // return this.eval(new Paper()); // } System.out.println("a"); return null; } } public class RoShaamBo { static final int SIZE = 20; private static Random random = new Random(47); public static Item newItem() { switch (random.nextInt(3)) { default: case 0: return new Scissors(); case 1: return new Paper(); case 2: return new Rock(); } } public static void match(Item a, Item b) { System.out.println(a.getClass().getName() + " vs " + b.getClass().getName() + " ; " + a.eval(b)); } public static void main(String[] args) { for (int i = 0; i < 20; i++) { match(newItem(), newItem()); } } }
上面match()方法中可以正确调用a.eval(b),确定a的类型,而b则不去确定其具体类型,一直使用其基类Item类型。传统的方法是重载eval(),在其中使用instanceOf来判断b的类型然后指定调用方法,这样很繁琐。
书中给出了这种再次使用单路分发的方式,巧妙的解决了这个问题。
代码为证:
// enums/Outcome.java package enums; public enum Outcome { WIN, LOSE, DRAW } // enums/RoShamBo1.java // Demonstration of multiple dispatching // {java enums.RoShamBo1} package enums; import java.util.*; import static enums.Outcome.*; interface Item { Outcome compete(Item it); Outcome eval(Paper p); Outcome eval(Scissors s); Outcome eval(Rock r); } class Paper implements Item { @Override public Outcome compete(Item it) { return it.eval(this); } @Override public Outcome eval(Paper p) { return DRAW; } @Override public Outcome eval(Scissors s) { return WIN; } @Override public Outcome eval(Rock r) { return LOSE; } @Override public String toString() { return "Paper"; } } class Scissors implements Item { @Override public Outcome compete(Item it) { return it.eval(this); } @Override public Outcome eval(Paper p) { return LOSE; } @Override public Outcome eval(Scissors s) { return DRAW; } @Override public Outcome eval(Rock r) { return WIN; } @Override public String toString() { return "Scissors"; } } class Rock implements Item { @Override public Outcome compete(Item it) { return it.eval(this); } @Override public Outcome eval(Paper p) { return WIN; } @Override public Outcome eval(Scissors s) { return LOSE; } @Override public Outcome eval(Rock r) { return DRAW; } @Override public String toString() { return "Rock"; } } public class RoShamBo1 { static final int SIZE = 20; private static Random rand = new Random(47); public static Item newItem() { switch(rand.nextInt(3)) { default: case 0: return new Scissors(); case 1: return new Paper(); case 2: return new Rock(); } } public static void match(Item a, Item b) { System.out.println( a + " vs. " + b + ": " + a.compete(b)); } public static void main(String[] args) { for(int i = 0; i < SIZE; i++) match(newItem(), newItem()); } }
原文地址:https://www.cnblogs.com/houj/p/11640627.html
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861C Did yo
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861B Which
- 信用卡安全问题:被用户忽视的识别码
- Python3快速排序
- Python3插入排序
- Python3冒泡排序
- Python Selenium设计模式-POM
- 【Python学习笔记之一】Python关键字及其总结
- 前后端分离了,然后呢?
- 【Python学习笔记之二】浅谈Python的yield用法
- LINUX中常用操作命令
- Java异常抛出及try,catch应用实例
- GitHub实战系列~2.把本地项目提交到github中 2015-12-10
- 前20名Python机器学习开源项目
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python获取B站视频弹幕 简单处理
- Python实现图片手绘效果
- Python给头像戴口罩
- Python表白窗口 仿某音设计
- Autonomous_driving_application_Car_detection_v3a
- Python实现图片相似度计算
- Python实现在原始视频上添加动态雪花
- Three.js学习|代码详解 个人见解
- Linux进程详解
- Face_Recognition_v3a
- Building_a_Recurrent_Neural_Network_Step_by_Step_v3b
- gym 搭建 RL 环境
- MNIST练习
- Dinosaurus_Island_Character_level_language_model_final_v3b
- Trigger_word_detection_v1a