使用常量相关的方法
常量相关的方法允许我们为每个enum实例提供方法的不同实现,
这使得常量相关的方法似乎是实现多路分发的完美解决方案。
不过,通过这种方式,enum实例虽然可以具有不同的行为,
但他们任然不是类型,不能将其作为方法签名中的参数类型
来使用。最好的办法是将enum用在switch语句中
import static enumerated.Outcome.*; public enum RoShamBo3 implements Competitor<RoShamBo3>{ PAPER{ public Outcome compete(RoShamBo3 it){ switch(it){ default: // To placate the compiler case PAPER: return DRAW; case SCISSORS: return LOSE; case ROCK: return WIN; } } }, SCISSORS{ public Outcome compete(RoShamBo3 it){ switch(it){ default: case PAPER: return WIN; case SCISSORS: return DRAW; case ROCK: return LOSE; } } }, ROCK{ public Outcome compete(RoShamBo3 it){ switch(it){ default: case PAPER: return LOSE; case SCISSORS: return WIN; case ROCK: return DRAW; } } }; public abstract Outcome compete(RoShamBo3 it); public static void main(String[] args){ RoShamBo.play(RoShamBo3.class, 20); } }
虽然这种方式可以工作, 却不合理, 如果采用RoShamBo解决方案, 在添加一个新
的类型时, 只需更少的代码, 而且更直接。
public enum RoShamBo4 implements Competitor<RoShamBo4>{ ROCK{ public Outcome compete(RoShamBo4 opponent){ return compete(SCISSORS, opponent); } }, SCISSORS{ public Outcome compete(RoShamBo4 opponent){ return compete(PAPER, opponent); } }, PAPER{ public Outcome compete(RoShamBo4 opponent){ return compete(ROCK, opponent); } }; Outcome compete(RoShamBo4 loser, RoShamBo4 opponent){ return ((opponent == this) ? Outcome.DRAW : ((opponent == loser) ? Outcome.WIN : Outcome.LOSE)); } public static void main(String[] args) { RoShamBo.play(RoShamBo4.class, 20); } }
2个参数的compete()方法执行第二个分发,该方法执行一系列的比较,
行为类似switch语句。 这个版本的程序简单,却比较难理解。
对于一个大型系统,难以理解的代码将导致系统不够健壮。
使用EnumMap分发
import static enumerated.Outcome.*; public enum RoShamBo5 implements Competitor<RoShamBo5>{ PAPER, SCISSORS, ROCK; static EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table = new EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>>(RoShamBo5.class); static{ for(RoShamBo5 it : RoShamBo5.values()) table.put(it, new EnumMap<RoShamBo5, Outcome>(RoShamBo5.class)); initRow(PAPER, DRAW, LOSE, WIN); initRow(SCISSORS, WIN, DRAW, LOSE); initRow(ROCK, LOSE, WIN, DRAW); } static void initRow(RoShamBo5 it, Outcome vPAPER, Outcome vSCISSORS, Outcome vROCK){ EnumMap<RoShamBo5, Outcome> row = RoShamBo5.table.get(it); row.put(RoShamBo5.PAPER, vPAPER); row.put(RoShamBo5.SCISSORS, vSCISSORS); row.put(RoShamBo5.ROCK, vROCK); } public Outcome compete(RoShamBo5 it) { return table.get(this).get(it); } public static void main(String[] args) { RoShamBo.play(RoShamBo5.class, 20); } }
使用二维数组
还可以进一步简化实现两路分发的解决方案, 每个enum实例都有一个固定的值(基于声明的次序),
并且可以通过ordinal()方法取得该值。因此我们可以使用二维数组,将竞争者映射到
竞争的结果。 这种方式能够获得最简洁,最直接的解决方案
public enum RoShamBo6 implements Competitor<RoShamBo6>{ PAPER, SCISSORS, ROCK; private static Outcome[][] tables = { {DRAW, LOSE, WIIN}, //PAPER {LOSE, WIN, DRAW}, //ROCK {WIN, DRAW, LOSE}, //SCISSOR }; public Outcome compete(RoShamBo6 other){ return table[this.ordinal()][other.ordinal()]; } public static void main(String[] args){ RoShamBo.play(RoShamBo6.class, 20); } }
发表评论
-
仿真[汽车制造]
2012-02-13 01:26 684class Car{ private final i ... -
线程例子[Condition, SignlAll, await]
2012-02-09 22:05 1030package concurrency.waxomati ... -
生产者消费者[简单示例]
2012-02-09 21:38 658class Meal{ private final ... -
泛型[创建类型实例]
2012-02-06 01:01 738public Class Erased<T> ... -
多路分发2[使用enum分发]
2012-02-05 18:09 1902直接将RoShamBo1.java翻译为基于enum的版 ... -
多路分发
2012-02-05 02:06 1382多路分发 Number.plus(Number) ... -
使用Enum的自动贩卖机
2012-02-04 13:52 922public enum Input { NICKEL ... -
使用enum的责任链
2012-02-04 12:39 1178package enumerated; impor ... -
枚举类Enum,EnumSet,EnumMap
2012-02-04 02:00 1421EnumSet与HashSet相比,非常快。 p ... -
枚举类enum
2012-02-03 15:00 904一般来说,我们希望每个美剧实例能够返回对自身的描述, ... -
类的简化历[从内部类到匿名内部类]
2012-02-02 12:41 634Version1: public class DirL ... -
持有引用java.lang.ref 和 WeakHashMap
2012-02-02 01:27 981Thinking in java P554 持 ... -
Collections快速报错 fial-fast
2012-02-02 00:46 787{ public static void main( ... -
散列HashCode
2012-02-01 14:04 704散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键 ... -
使用散列数据结构注意点
2012-02-01 01:32 590Goundhog自动继承基类Object,所以这里使用 ... -
Set注意点
2012-02-01 01:31 308如果我们尝试着将没有恰当支持不许的操作的类型用于需要这些 ... -
享元Map
2012-01-30 00:28 381这里之所以叫享元,注意static关键字。 定制了Entry ... -
深入容器Map
2012-01-19 15:12 398Map生成器 对Map的使用相同的方式,需要一 ... -
深入容器List
2012-01-19 14:40 342一种Generator解决方案: 所有Collect ... -
泛型数组
2012-01-19 00:57 637不能创建泛型数组,但能通过转型来赋予 public cl ...
相关推荐
RTSP多流分发的核心是将一个输入的RTSP流复制并分发到多个不同的输出流,使得多个客户端可以同时访问同一内容。这种技术在需要向大量用户实时推送相同内容的场景中非常实用,例如大型在线直播、视频会议或监控系统。...
在有多个边界路由器的情况下,推荐使用单向重分发,避免回环和收敛问题,可以使用默认路由来限制外部路由的传播。而在单边界情况下,双向重分发可能是安全的,但需要配合路由过滤和调整管理距离来防止回环。 实验...
在IT行业中,直播平台已经成为内容创作者与...通过多路推流插件,主播可以轻松地将内容分发到多个直播平台,而OBS多开则提供了灵活的场景管理和并发直播能力。对于想要优化直播体验的专业人士,掌握这些技能至关重要。
Nginx以其卓越的性能和稳定性在Web服务器市场占据一席之地,其核心特性之一就是其对多路复用并发的支持。 **多进程模型** 在多进程模型中,服务器启动时会创建多个子进程来处理客户端请求。每个子进程都是独立的,...
最后,为了支持多路视频传输,系统可能还需要**流媒体服务器**来分发视频流。服务器可以缓存和管理多个并发的视频流,根据客户端的需求进行动态调度和分发。此外,使用**流媒体协议**如RTSP(Real-Time Streaming ...
- 使用封装类实现网络通信模块的功能,包括`IPAddress`类处理套接字地址,异常处理类管理Socket异常,以及网络通信类提供TCP、多线程和多路复用等功能。 - 下载并集成IPv6支持补丁,主要包括`tpipv6.h`和`wspiapi....
3. 多路视频合成:多路视频合成是指将多个独立的视频流合并成一个单一的视频文件。在FFmpeg中,可以使用`-i`参数指定输入视频流,然后通过过滤器(如`hstack`或`vstack`)来实现水平或垂直堆叠,从而将多路视频合成...
3. **Block和Closure**:在多路并发中,Block是一种强大的工具,它可以封装代码块,并且可以作为参数传递。在GCD中,我们通常使用Block来定义并发任务。 4. **NSRunLoop**:它是iOS中的事件循环,用于处理系统事件...
这类设备通常应用于通信、监控、自动化等多个领域,其核心功能是将输入的多路信号进行分解、转换或者分发到不同的通道,以实现高效的数据处理和管理。 多路分解设备的设计原理往往基于数字信号处理技术,它能够接收...
在IT行业中,多路复用器(Multiplexer)是一种用于高效管理网络连接的工具,它允许在一个单一的连接上处理多个并发请求。Go-gemux是针对Go语言环境设计的一个多路复用器,尤其适用于HTTP服务场景。下面将详细探讨这...
在这个场景中,Golang的多路复用I/O(例如select、goroutine和channel)特性使得工具能够同时处理多个Webhook请求,实现高效且并发安全的监听和分发。 工具支持多个目录分发,这意味着你可以配置不同的目标路径,将...
3. **数据分配器**:数据分配器可以将一个输入信号复制并分发到多个输出,这对于广播式的信息发布或数据同步非常有用。在电子政务系统中,这可能用于将公告、政策法规等信息推送给多个终端用户或部门。 4. **系统...
《使用Live555在VS2013下编译及OpenRTSP实践》 Live555是一个开源的多媒体框架,广泛应用于实时流媒体协议的实现,如RTSP(Real-Time Streaming Protocol)、RTCP(Real-Time Transport Control Protocol)以及RTP...
4. **多路复用与分发**:多路电视调谐解调器能够将不同频道的内容整合到一起,形成一个单一的传输流,便于通过光纤、同轴电缆或其他通信链路进行传输。同时,也可以根据需要将特定频道的内容分发给多个目的地。 5. ...
1. **多路传输**:此平台支持多路传输,意味着可以同时处理多个文件或数据流的上传和下载,提高文件传输效率。这种特性对于大量数据交换或者需要快速响应的环境尤其重要,如大数据分析、媒体分发等。 2. **安全性**...
5. **多路合并与分发**:在接收端,如何有效地合并来自多个并行信道的数据,保持数据的完整性和正确性。 文件名“多路并行传输宽带高速跳频通信方法及装置.pdf”可能包含详细的技术描述、原理图、实验结果以及具体...
在电子工程领域,多路分配器、源极驱动电路和显示器是至关重要的组成部分,它们各自在电路设计中扮演着不同的角色。以下是对这些主题的详细解释: **多路分配器**,也称为多路开关或数据选择器,是一种数字集成电路...
多路传输是指在一个网络连接中同时传输多个数据流的能力,这通常通过多路复用技术实现,如TCP/IP协议栈中的TCP连接或UDP套接字。在网络游戏场景中,多路传输允许游戏服务器同时处理并发送多个玩家的动作、状态更新和...
综上所述,网络游戏数据分发网络的性能优化涉及多个层面,包括缓存策略、CDN、负载均衡、协议优化、多路复用、预加载预测、边缘计算以及安全措施等。理解并应用这些技术,可以构建一个更加高效、稳定且用户友好的...