Java - 避免静态函数的switch语句

时间:2014-02-20 15:27:42

标签: java oop polymorphism switch-statement

查看此代码 -

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();

我的解决方案的问题是功能是静态的,我无法实现具有静态功能的接口。如果你不明白为什么我编写接口,因为我想在上面的解决方案中使用多态。

2 个答案:

答案 0 :(得分:15)

我会像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 :(得分:3)

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

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:只需将所有逻辑放入枚举中。