【发布时间】:2013-10-28 20:29:01
【问题描述】:
对于竞技场游戏,我有一个可能的游戏类型的枚举。这些游戏类型中的每一个都有一个与之关联的变体列表以及每个枚举的 2 个类,用于侦听事件和处理配置值。目前,我从枚举中构建这些侦听器和配置加载器。在这样做时,我必须使用 switch 语句。以下方法从枚举值中获取侦听器。
public GameListener getListener(CustomGame cg) {
switch(this) {
case Slayer:
return new SlayerListener(cg);
case Capture_The_Flag:
return new CaptureTheFlagListener(cg);
case Oddball:
return new OddballListener(cg);
case HeadHunter:
return new HeadHunterListener(cg);
case King_Of_The_Hill:
return new KOTHListener(cg);
default:
return null;
}
}
配置存在类似的代码。我知道使用抽象方法可以删除 switch 语句,但我想知道是否有更简单的方法。我试图让我的枚举采用 2 个类型参数,但我无法让它工作,而且我无法用它们构建。一种选择是传入Class<T> 并通过反射构造对象。
这个类中还有另一种方法,每个枚举都有非常不同的布局,我认为最好的选择是抽象方法,但我觉得这里有一个更简单的解决方案。
【问题讨论】:
-
您的解决方案已经是最简单的解决方案(并且在性能方面也是最好的解决方案)。您可以通过将
return语句与case语句放在同一行来使其看起来更简洁。 -
如果性能在这里不计算在内(我想它不计算在内),并且您想优化案例以不需要在新枚举进入时对其进行维护,我建议您添加类以创建枚举的侦听器作为参数并在其上调用 newInstance()。在 Listener 接口上有一个 setCustomGame() 方法并调用它来初始化监听器。
-
@Robert 唯一的问题是每次添加枚举值时我都必须手动更新每个 switch 语句,这很常见。
-
@thst 这就是我想要发生的事情,只是我可以轻松地将自定义游戏作为参数传递给构造函数,而不是添加该方法。 (CustomGame 是最终版本,修改它会破坏很多。)
-
这个设计对我来说看起来不错,虽然我宁愿创建一个
ListenerFactory.createListenerFor(GameType type)而不是直接使用枚举。枚举非常严格,因为您不能添加任何状态。就我个人而言,当GameType创建一个听众时,我感觉很舒服,而且我现在非常愿意听这些迹象(只花了 25 年的时间开发:P)哦是的,如果可能的话,抛出一个IllegalStateException而不是返回null。
标签: java enums switch-statement