Стиль Java: объявление переменной в переключателе - PullRequest
2 голосов
/ 17 сентября 2010

Следующий код не компилируется, потому что eater определяется дважды:

switch (vegetable) {
    case TOMATO:
        Eater eater = new Eater(Tomato.class, many parameters);
        eater.eat(more parameters);
        return true;

    case POTATO:
        Eater eater = new Eater(Potato.class, many parameters);
        eater.eat(more parameters);
        return true;

    case CARROT:
        doSomethingElse();
        return true;
}

Должен ли я:

  • Используйте отдельные переменные `tomatoEater` и` potatoEater`, делая код менее обслуживаемым?
  • Определить `eater` перед` switch`, сделав его доступным больше, чем следовало бы?
  • Определить «едока» только в первый раз, что может привести к путанице?
  • Добавить фигурные скобки, чтобы сделать код более многословным?
  • Есть идея получше?

Ответы [ 5 ]

6 голосов
/ 17 сентября 2010

Я бы лично использовал фигурные скобки или просто полностью отказался от локальной переменной:

new Eater(Potato.class, many parameters)
     .eat(more parameters);

Недостаток этого метода в том, что его немного сложнее отлаживать. Очевидно, что это не ваш настоящий код, хотя ... из-за чего сложно сказать, что нужно делать. Вполне возможно, что правильным решением будет на самом деле , чтобы разбить тела дел на отдельные методы.

2 голосов
/ 17 сентября 2010

Почему бы и нет:

switch (vegetable) 
{ 
    case TOMATO: 
        new Eater(Tomato.class, many parameters).eat(more parameters); 
        return true; 

    case POTATO: 
        new Eater(Potato.class, many parameters).eat(more parameters); 
        return true; 

    case CARROT: 
        doSomethingElse(); 
        return true; 
} 

Если вы не используете ссылку Eater где-либо еще позже, я бы сделал это.

1 голос
/ 17 сентября 2010

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

Eater eater = vegetable.getEater(many parameters);
if (eater != null) eater.eat(more parameters);
else doSomethingElse();
return true;
0 голосов
/ 17 сентября 2010

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


В каком лучшем примере можно представить оператор switch в Java?

0 голосов
/ 17 сентября 2010

Как использование отдельных переменных сделает код менее обслуживаемым?(первая точка пули).Если я что-то скажу, это будет наоборот, поскольку имя переменной лучше объясняет, что это такое.Я бы согласился с этим, если для вас важно сохранить его в этом объеме.

...