Java 我是否以正确的方式使用switch语句

Java 我是否以正确的方式使用switch语句,java,switch-statement,Java,Switch Statement,这是一个yahtzee游戏,这个方法应该计算并返回五个骰子的值。但这是一种愚蠢的方法吗?它有一个switch语句,由用户选择的类别的参数传递,然后为每个可能的类别传递一个for循环。有没有比我的设计理念更简单的方法 private int assignScoreToCategory(int category) { int computedScore = 0; println("dice: "+dice1+" "+dice2+" "+dice3+" "+dice4+" "+dice

这是一个yahtzee游戏,这个方法应该计算并返回五个骰子的值。但这是一种愚蠢的方法吗?它有一个switch语句,由用户选择的类别的参数传递,然后为每个可能的类别传递一个for循环。有没有比我的设计理念更简单的方法

private int assignScoreToCategory(int category)
{
    int computedScore = 0;
    println("dice: "+dice1+" "+dice2+" "+dice3+" "+dice4+" "+dice5);

    //  Switches on the category the user has selected.
    switch (category)
    {
    case ONES: 
        for (int i = 0; i < 4; i++){
            if (diceArray[i] == ONES){
                println(computedScore);
                computedScore++;
            }
        }break;

    case TWOS: 



        break;
    case THREES: break;
    case FOURS: break;
    case FIVES: break;
    case SIXES: println("cat 6");   break;
    case UPPER_SCORE: break;
    case UPPER_BONUS: break;
    case THREE_OF_A_KIND: break;
    case FOUR_OF_A_KIND: break;
    case FULL_HOUSE: break;
    case SMALL_STRAIGHT: break;
    case YAHTZEE: break;
    case CHANCE: break;
    case LOWER_SCORE: break;
    case TOTAL: break;
    default: return 0; 
    }
    return computedScore;
}
private int assignScoreToCategory(int类别)
{
int计算得分=0;
println(“骰子:+dice1+”+dice2+“+dice3+”+dice4+”+dice5);
//打开用户选择的类别。
开关(类别)
{
案例一:
对于(int i=0;i<4;i++){
if(数组[i]==个){
println(计算得分);
计算分数++;
}
}中断;
案例二:
打破
案例三:断裂;
案例四:断裂;
案例五:突破;
案例六:println(“第6类”);断裂;
病例上限评分:中断;
案例上限奖金:中断;
案例三:破碎;
案例四:破碎;
案例满屋:休息;
案例小_直:断裂;
案例YAHTZEE:中断;
案例机会:突破;
病例低分:中断;
病例总数:破裂;
默认值:返回0;
}
返回计算得分;
}

您应该非常明确地使用
enum
而不是
int
。然后,作为进一步的改进,将switch语句中包含的逻辑移到enum的实例方法中。然后,只需一个方法调用即可替换
开关
。有很好的语法为每个枚举成员提供不同的实现。将这一想法与一个通用方法实现结合起来,该方法实现尽可能多地覆盖了基础,可能借助于一些实例变量:

enum Category {
  private final int score;
  ... 
  ONES(1) { 
    public int score() { 
      int computedScore = 0;
      for (int i = 0; i < 4; i++) {
       if (diceArray[i] == ONES) {
          println(computedScore);
          computedScore++;
       }
      }
      return computedScore;
    }
  },
  ...,
  SIXES(6),
  ...;

  private Category(int score) { this.score = score; }

  public int score() { return this.score; }
}
枚举类别{
个人最终积分;
... 
一(1){
公共整数分数(){
int计算得分=0;
对于(int i=0;i<4;i++){
if(数组[i]==个){
println(计算得分);
计算分数++;
}
}
返回计算得分;
}
},
...,
六(6),
...;
私有类别(整数分数){this.score=score;}
public int score(){返回this.score;}
}

我想给你一个更完整的例子,但你没有提供太多具体的逻辑。

你应该使用
enum
而不是
int
。然后,作为进一步的改进,将switch语句中包含的逻辑移到enum的实例方法中。然后,只需一个方法调用即可替换
开关
。有很好的语法为每个枚举成员提供不同的实现。将这一想法与一个通用方法实现结合起来,该方法实现尽可能多地覆盖了基础,可能借助于一些实例变量:

enum Category {
  private final int score;
  ... 
  ONES(1) { 
    public int score() { 
      int computedScore = 0;
      for (int i = 0; i < 4; i++) {
       if (diceArray[i] == ONES) {
          println(computedScore);
          computedScore++;
       }
      }
      return computedScore;
    }
  },
  ...,
  SIXES(6),
  ...;

  private Category(int score) { this.score = score; }

  public int score() { return this.score; }
}
枚举类别{
个人最终积分;
... 
一(1){
公共整数分数(){
int计算得分=0;
对于(int i=0;i<4;i++){
if(数组[i]==个){
println(计算得分);
计算分数++;
}
}
返回计算得分;
}
},
...,
六(6),
...;
私有类别(整数分数){this.score=score;}
public int score(){返回this.score;}
}

我想给你一个更完整的例子,但你没有提供太多具体的逻辑。

你可能应该考虑拥有一个接口或抽象基类,这样它就不会变得如此混乱。使用这个你也会有很多重复的代码我同意,所有这些代码都在主类中,每个switch语句都错失了多态性的机会——那么为什么不使用calculateScore方法创建一个类层次结构GameCography呢?您可能应该考虑使用一个接口或抽象基类,这样它就不会变得如此混乱。使用它,你也会有很多重复的代码。我同意,将所有这些代码放在主类中,会变得很混乱。每个switch语句都会错过多态性的机会-所以为什么不使用calculateScore方法创建一个类层次结构GameCography?这是一个很酷的建议,一个很好的例子;)这是一个很酷的建议,一个很好的例子;)