【问题标题】:Java - avoid switch statements for static functionsJava - 避免静态函数的 switch 语句
【发布时间】:2014-02-20 15:27:41
【问题描述】:

查看此代码 -

switch(kind) {
     case "green" :
           GreenKind.doSomething(); // Static function
     break;
     case "white" :
           WhiteKind.doSomething(); // Static function
     break;
     case "blue" :
           BlueKind.doSomething(); // Static function
     break;
     case "yellow" :
           YellowKind.doSomething(); // Static function
     break;
}

有没有办法避免switch语句?因为它闻起来很糟糕。

也许是这样的? -

kinds.get(kind).doSomething();

我的解决方案的问题是函数是静态的,我无法使用静态函数实现接口。如果你不明白我为什么写 interface 它是因为我想在上面的解决方案中使用多态性。

【问题讨论】:

  • 听起来你应该有一个枚举而不是那些静态方法......

标签: java oop polymorphism switch-statement


【解决方案1】:

我会有一个像这样的enum

enum Kind {
    GREEN {
        @Override
        public void doSomething() {
            GreenKind.doSomething();
        }
    },
    WHITE {
        @Override
        public void doSomething() {
            WhiteKind.doSomething();
        }
    };

    public abstract void doSomething();
}

并传递一个枚举常量,例如这个方法:

public static void invoke(Kind kind) {
    kind.doSomething();
}

然后这样称呼它:

invoke(Kind.GREEN);

这种方式看起来更干净,而且更安全,因为您只能有一组固定的输入。

【讨论】:

  • 这是一个非常经典的重构。恭喜!
  • +1:天哪。经过 6 年的 Java 经验,我仍然不知道这可以使用枚举... :)
  • @MartijnCourteaux 甚至可以同时将“实例变量”和方法传递给枚举;语法有点重,不过
  • @fge 我没明白你的意思。
【解决方案2】:

您可以使用枚举。单个条目枚举的示例:

public enum Kind
{
    GREEN("green")
    {
        @Override
        public void doSomething() { /* do something */ }
    };

    private final String asString;

    public abstract void doSomething();

    Kind(final String asString)
    {
        this.asString = asString;
    }

    @Override
    public String toString() { return asString; }
}

在代码中,您将执行Kind.valueOf(kind.toUppercase()).doSomething();

这也可以让您通过一些工作摆脱 {Green,Red}Kind:只需将所有逻辑放入枚举中。

【讨论】:

  • 我喜欢您和 Rohit Jain 的回答,稍后会接受。很难选择:) 顺便谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
相关资源
最近更新 更多