В каком лучшем примере можно представить оператор switch в Java? - PullRequest
1 голос
/ 18 августа 2010

Я уверен, что есть лучшие примеры, чем у меня:)

Допустим, идет снег, и пользователи могут зарабатывать очки за каждую снежинку, но они должны делать это быстро, чтобы не застрять в снегу, так что это мой бывший:

class apples{
    public static void main(String args[]){
        int points;
        points = 1;

        switch (points){
        case 1:
            System.out.println("32");
            break;
        case 2:
            System.out.println("Almost half");
            break;
        case 3:
            System.out.println("You're near");
            break;
        case 4:
            System.out.println("Congratulations., You got 100 points");
        default:
            System.out.println("Want to start again?");
        break;  
        }
    }
}

Ответы [ 5 ]

4 голосов
/ 18 августа 2010

Оператор switch долгое время не использовался.

Первоначальная идея заключалась в том, чтобы иметь систему точек входа; goto -подобное утверждение, которое работало так:

If my value is 1; goto 1;
Else If my value is 2; goto 2;
Else If my value is 3; goto 3;
Else If goto default;
label 1 : ...;
label 2 : ...;
label 3 : ...;
label default : ...;

И людям начала нравиться эта система, и они решили, что это будет лучше, чем множество утверждений if / else. Поэтому они использовали небольшую хитрость, break; И теперь люди действительно наслаждаются переключателем как заменой if / else, ломая каждый случай переключателя.

Чтобы иметь действительно хороший пример оригинального оператора switch, у вас должно быть что-то вроде этого:

public void printDaysLeftUntilNextMonday(){
    switch(dayOfWeek){
        case 1 :
            System.out.println("Monday");
        case 2 :
            System.out.println("Tuesday");
        case 3 :
            System.out.println("Wednesday");
        case 4 :
            System.out.println("Thursday");
        case 5 :
            System.out.println("Friday");
        case 6 :
            System.out.println("Saturday");
        case 7 :
            System.out.println("Sunday");
    }
}

У меня был реальный случай использования в день (редкая вещь, если вы не злоупотребляете перерывом; в переключателе) это было в палаче.

public void printHangman(){
    switch(triesLeft){
        case 1 :
            printLeftLeg();
        case 2 :
            printRightLeg();
        case 3 :
            printLeftArm();
        case 4 :
            printRightArm();
        case 5 :
            printBody();
        case 6 :
            printHead();
    }
}
4 голосов
/ 18 августа 2010

Если вы хотите иметь больше гибкости, чем HashMap (не то, чтобы с решением было что-то не так), вы можете пойти по цепочке ответственности:

class PointScore {
   private PointScore next;
   private int points;
   private String msg;

   public PointScore(int points, String msg) {
      this.points = points;
      this.msg = msg;
      this.next = null;
   }

   public PointScore setNext(PointScore next) {
      this.next = next;
      return next;
   }

   public boolean checkScore(int points) {
      if (this.points == points) {
         System.out.println(this.msg);
         return true;
      } else if (null != next) {
         return next.checkScore(points);
      } else {
         return false;
      }

   }

}

Тогда ваша основная точка входа:

class Apples {

   public static void main(String...args) {
      int points;
      points = 1;

      // set first condition (highest priority first)
      PointScore scores = new PointScore(4, "Congratulations., You got 100 points");
      // set next chain members in order or priority (highest to lowest)
      scores.setNext(new PointScore(3, "You're near"))
         .setNext(new PointScore(2, "Almost half"))
         .setNext(new PointScore(1, "32"));

      if (!scores.checkScore(points)) {
         System.out.println("Want to start again?");
      }
   }
}

Это выглядит не очень, но метод checkScore может выполнять другие проверки; например, вы можете установить диапазон значений вместо одного points целого числа и т. д.

0 голосов
/ 18 августа 2010

Я считаю, что операторы switch наиболее целесообразны, когда диапазон переменной ограничен. Так, например, приведенный здесь пример дней недели в порядке, а пример с перечислением - еще лучше.

Немного простой, но Википедия имеет отличную страницу с историей, преимуществами и недостатками оператора switch, а также множество примеров на разных языках.

0 голосов
/ 18 августа 2010

Хорошо, мы идем. На работе мы часто используем enum типы, простой пример:

public enum Colors {
   RED,
   GREEN,
   BLUE,
   YELLOW,
   VIOLET,
   BROWN,
   ORANGE; // more to come
} 

, чтобы мы могли переключать следующие буквенные константы:

public String colorToMood(final Colors color) {
    String mood = "everything the same to me";
    switch (color) {
      case RED:
        mood = "excited";
        break;
      case YELLOW:
        mood = "I like the sun";
        break;
      case GREEN:
        mood = "forests are nice";
        break;
      case BLUE:
        mood = "I feel free like a bird in the sky";
        break;
      // fill in your code here for VIOLET, BROWN, ORANGE
      // otherwise they get handled by the default clause
      default:
        mood = "I don't know your color";
        break;
    }
    return mood;
}

Может быть, теперь вы получите лучшее представление о преимуществах переключателя в сочетании с перечислениями. Вы даже можете определить конструктор для ваших констант enum, но это становится слишком сложным ...

0 голосов
/ 18 августа 2010

Используйте словарь или хэш-карту, чтобы отобразить количество точек в строке.

...