2010-09-17 3 views
2

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

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`, делая его доступным больше, чем нужно?
  • Определить `eater` только в первый раз, что приводит к потенциальной путанице?
  • Добавить брекеты, делая код более подробным?
  • Любая идея?
+8

Я * действительно * не хочу знать, что делает метод doSomethingElse(). – CurtainDog

+0

BTW, я вижу '{' в новой строке после долгого времени ... Чувствует себя хорошо, когда кто-то еще кодит так же, как и я :-) – Nivas

+0

CurtainDog: LOL Клянусь, это было абсолютно случайно! Nivas: Fixed ;-) –

ответ

6

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

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

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

+0

Ударьте меня в это ... – Nivas

+0

Метод извлечения - ваш друг. – mjfgates

+0

@mjfgates: Не всегда. Возьмите каждый случай, когда он появится. Для двухстрочного я думаю, что я часто бывал с дополнительными фигурными скобками. Однако во многих других случаях я согласен. –

2

Почему бы не так:

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 где-либо еще позже, я бы сделал это.

0

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

+0

Чем больше каждый случай похож, тем проще всего скопировать-вставить, чтобы создать новый регистр или рефакторинг. Предположим, я хочу добавить 'eater.init()' после каждого создания, это будет болезненно, если мне придется адаптировать имя переменной для каждого случая. Я не могу создать много имен переменных, если нет веских оснований. Кроме того, он занимает немного больше памяти, если не используется с фигурными скобками. –

1

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

Eater eater = vegetable.getEater(many parameters); 
if (eater != null) eater.eat(more parameters); 
else doSomethingElse(); 
return true;