有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java删除枚举中的Switch语句

对于竞技场游戏,我列举了一些可能的游戏类型。每个游戏类型都有一个与之关联的变体列表,每个枚举有两个类,用于侦听事件和处理配置值。目前,我从枚举中构造这些侦听器和配置加载程序。但在这样做时,我必须使用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;
    }
}

configs也有类似的代码。我知道使用抽象方法可以删除switch语句,但我想知道是否有更简单的方法。我试图让我的枚举接受2个类型参数,但我无法使其工作,也无法使用它们进行构造。一个选项是传入Class<T>并通过反射构造对象

这个类中还有另一个方法,每个枚举有非常不同的布局,我认为最好的选择是抽象方法,但我觉得这里有一个更简单的解决方案


共 (1) 个答案

  1. # 1 楼答案

    如果性能无关紧要,您可以使用以下通用GameListener Getter:

    public Listener getListener( CustomGame cg ) {
        // implement some smart way to find your listener implementation here...
        Class<? extends Listener> clzz = Class.forName( this.getClass().getPackage() + "." + name() );
        Listener ret = clzz.newInstance();
        ret.setCustomGame(cg);
        return ret;
    }
    

    这将不需要维护,也不需要枚举中的特殊参数。但当然,它会将枚举名直接链接到所创建的类名,这可能不是所需的约束