实现一般的开关案例

时间:2013-01-11 19:39:36

标签: java switch-statement

我想用Java创建一个通用的switch case语句。 我正在编写一个程序,在某些时候我必须为switch语句创建32个不同的case:case 0 : , case 1 : , .... case 31 :。然后在每种情况下我都要编写一些代码行。有没有办法实现一般的switch case语句,这样我就不必编写32个单独的case?

例如:

switch(n){
case k :
.....
{

我如何在java中实现它?有可能吗?

4 个答案:

答案 0 :(得分:5)

为什么不使用default分支:

switch (n) {
  // cases for which you need custom behavior...
  default:
    // use n for the general case
}

答案 1 :(得分:1)

您可以使用枚举。例如,这是一个枚举,它将数字的名称与其整数值匹配:

enum MyDigit
{
    ZERO(0),
    ONE(1),
    TWO(2),
    // etc
    NINE(9);

    private final int intValue;

    MyDigit(int intValue)
    {
        this.intValue = intValue;
    }

    public int intValue()
    {
        return intValue;
    }
}

枚举非常灵活。例如,您还可以构建所有值的反向映射,并使用静态查找方法来获取枚举所需的值。

(是的,有些人会说整数值在这里是多余的,因为我可以使用values() / ordinal(),但这只是为了说明)

答案 2 :(得分:0)

当您看到32个案例的switch语句和可能经常需要增强的案例时,它通常会发出code or design "smell"的信号。您可能需要在代码的多个位置复制此交换机结构,然后以高维护成本和违反Open/closed PrincipleSingle Responsibility Principle的脆弱代码结束(作为单个需求的变化可能会迫使您在多个位置进行机会编码。)

此问题的解决方案是将代码分解为多个类以利用polymorphism。当您处理分解时,您必须考虑Design Pattern将为您提供最适合替换switch语句的内容。一些潜在的候选人(因为我不知道您的代码的性质)是:CommandStrategyVisitor;但也有其他人。

答案 3 :(得分:0)

  

在每种情况下我必须写2行,它们的变量取决于案例...所以在案例0中,我将要使用的变量是0 * L(l是我想要的值的变量,首先它的L = 8)...然后情况1是1 * L ...情况2:2 * L等等

好吧,检查你的输入数字是0到32之间的数字,然后只做n * L

int result = 0;
if(n>=0&&n<32){
    result=n*L;
}else{
    System.err.println("wrong number");
    //or do whatever you have to
}