2015-12-02 68 views
-1

所以我需要实现一个switch语句,在给定命令时使用。这些命令就像“结束”或“B”。但是,其中一个命令在程序后面提到某个事物后,会以“S1”或“S6”的形式进行设置。我可以为所有其他命令执行switch语句,并且还可以同时执行“S”+ int吗?这意味着它将转到以“S”开头的switch语句的那一部分,而不管之后的编号如何?我可以用带这个参数的字符串做一个switch语句吗?

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

不,你不能这样做。 – Tunaki

+1

你必须在'default:'中处理它。 –

+1

使用默认情况(其他情况不匹配),然后在那里执行正则表达式,可以避开它。 – JCOC611

回答

0

号如果这种开关是要走的正确方法(如果经常不,你可能希望看到在这种情况下枚举多么富有帮助),那么你可以试试这个:

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的答案。

为例:(当然,你可以把所有的逻辑基础doStuff(),而忘记了重写它为每个枚举值,如果这是你的情况更好)

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

    public abstract Object doStuff(); 
}; 

那么你的应用程序代码可以这样做

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

你的意思是'command.charAt(0)'而不是'command [0]',对吧? :) –

+0

嘿是的。对不起,现在用C#模式:) –

1

由于Java 7,在switch声明的情况下,标签可以String秒。当然,那么switch表达式也必须是String。案例标签必须是常数String s,但是,没有任何形式"S" + %d (???)或任何类似的东西都支持。

如果你只有一个特例命令来处理,但是,那么也许你可以在default情况处理:

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