2013-12-07 4 views
0

Я хочу иметь переключатель заявление, как следующее:Java Использование переключателя переменной в нескольких случаях лучшей практики

switch (something) 
{ 
    case 1: 
     int a = 3; 
     ... 
     break; 
    case 2: 
     int a = 4; 
     .... 
     break; 
} 

Это не работает, потому что не может быть переопределена в этой области. Я вижу следующие варианты:

  1. просто идти с «а = 4» в случае 2
  2. поместить каждый случай в фигурных скобках
  3. определить переменную перед оператором коммутатора
  4. использовать другое имя переменной в случай 2

Мне не нравится ни один из этих четырех. Какой из них - путь, или я не вижу лучшего решения?

Я видел такие вопросы как one, которые предлагают использовать фигурные скобки, но они не о лучшем способе сделать это, а о том, чтобы заставить его работать вообще.

+6

Что цель 'switch' в контексте вашего кода? Кроме того, почему вам не нравятся эти варианты? Это одна из тех вещей, где они просто вас раздражают? Или у вас есть объективная причина дизайна? Что бы вы предпочли в идеальном мире? – Vidya

+0

Я бы описал это как написано выше. (Как с фигурными скобками, но без необходимости добавлять дополнительные фигурные скобки) Мне не нравится 4, потому что это своего рода обходной путь, и мне не нравится 1, потому что это труднее увидеть. 2 и 3 - это то, с чем я в порядке, но не «совершенен». Я просто спрашивал себя, что будет «правильным путем», чтобы сделать это, или если есть еще лучший способ. – Flo

+0

Как насчет 'int a = 2 + something;' без каких-либо подробностей, кажется, он прост. –

ответ

2

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

default: 
    doSomething(); 
    break; 

oracle style guide не использует брекеты. В нем также говорится, что пропущенный комментарий следует добавлять везде, где утверждение не имеет перерыва.

Однако все, что имеет более одной строки, может быть завернуто в скобки без штрафа за производительность, для удобства чтения и надежности. Скобки говорят компилятору создать новую область и выполнить этот код в виде блока. Если все, что вы делаете, это изменение a, то это действительно не обязательно. Если вы можете написать свой оператор case switch на одной строке без брекетов, сделайте это. Многие вещи в java не выполняют привязки в одном экземпляре строки, включая инструкции if.

Далее вы можете переопределить любую переменную, которую необходимо повторно использовать или установить в операторах за пределами оператора switch. Это было бы наилучшей практикой, чтобы свести к минимуму непрерывную реализацию ваших целых чисел.

Если есть более одной строки, вы должны попробовать сделать несколько методов то, пойти с:

int a=0; 

switch (something) 
{ 
    case 1:{ 
     a = 3; 
     ... 
     break; 
    } 
    case 2:{ 
     a = 4; 
     .... 
     break; 
    } 
    default: 
    { 
     try{ 
      throw new IllegalStateException(); 
     }catch(IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
1

Скобки - это правильный способ сделать это. {} создает новую область, которая именно вы хотите.

0

Вы также можете использовать карту:

Map<Integer, Integer> caseMap = new HashMap<Integer, Integer>() {{ 
    put(1, 3); 
    put(2, 4); 
}}; 

int a = caseMap.get(something); 
+0

спасибо за ваш ответ, но мой пример был очень упрощенным. В случаях есть код, который должен быть выполнен (отсюда «...»), поэтому это не сработает. – Flo

Смежные вопросы