【问题标题】:Can I do a switch statement with Strings with this parameter?我可以使用带有此参数的字符串执行 switch 语句吗?
【发布时间】:2015-12-02 21:51:02
【问题描述】:

所以我需要实现一个在给定命令时使用的 switch 语句。命令类似于“end”或“B”。但是,其中一个命令设置为“S1”或“S6”,在程序中稍后引用某个事物后的 int。我可以同时为所有其他命令以及“S”+ int 一个 switch 语句吗?这意味着它将转到以“S”开头的那部分 switch 语句,而不管后面的数字是多少?

switch(command) {
    case "B":
        ....
        break;
    case "S" + %d (???):  // I know this won't work, just trying to convey the idea
        ....
        break;
}

【问题讨论】:

  • 不,你不能那样做。
  • 您必须在 default: 中处理。
  • 也许可以使用默认情况(没有其他情况匹配)然后在那里执行正则表达式检查。

标签: java switch-statement


【解决方案1】:

从 Java 7 开始,switch 语句中的 case 标签可以是 Strings。当然,那么switch 表达式也必须是String。但是,大小写标签必须是常量Strings,因此不支持"S" + %d (???) 或类似的形式。

但是,如果您只有一个特殊情况命令要处理,那么也许您可以在 default 情况下处理它:

switch(command) {
    case "B":
        ....
        break;
    case "FOO":
        // ...
        break;
    default:
        if (command.startsWith("S")) {
            // ...
        } else {
            // whatever ...
        }
        break;
}

【讨论】:

    【解决方案2】:

    没有。如果这种切换是正确的方法(如果经常不是;您可能想看看丰富的枚举如何在这种情况下提供帮助),那么您可以试试这个:

    switch (command.charAt(0)) {
        case 'B':
            ....
            break;
        case 'S':
            switch (command.chatAt(1)) {
                case '0':
                    ....
                    break;
            }
            ....
            break;
    }
    

    in the Java tutorials 解释了向枚举添加方法,这可能会导致在这种情况下更易读的应用程序代码。 Stack Overflow 上有几个很好的例子;查看this question的答案。

    举个例子:

    public enum CommandType {
        B {
            @Override
            public Object doStuff() {
                ...
            }
        },
        ...
        S1 {
            @Override
            public Object doStuff() {
                ...
            }
        },
        ...
        S6 {
            @Override
            public Object doStuff() {
                ...
            }
        }
    
        public abstract Object doStuff();
    };
    

    (当然,您可以将所有逻辑放在基础 doStuff() 中,然后忘记为每个枚举值覆盖它,如果这对您来说更好的话。)

    然后你的应用程序代码可以做类似的事情

    Enum.valueOf(CommandType.class, command).doStuff();
    

    【讨论】:

    • 您的意思是command.charAt(0) 而不是command[0],对吗? :)
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2016-06-19
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多