Почему тела разных состояний не находятся в разных областях? - PullRequest
6 голосов
/ 27 августа 2010

Почему тела разных корпусов не попадают автоматически в свою область?Например, если бы я сделал это:

switch(condition) {
  case CONDITION_ONE:
    int account = 27373;
  case CONDITION_TWO:
    // account var not needed here
  case CONDITION_THREE:
    // account var not needed here
  case CONDITION_FOUR:
    int account = 90384;
}

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

switch(condition) {
  case CONDITION_ONE: {
    int account = 27373;
  }
  case CONDITION_TWO: {
    // account var not needed here
  }
  case CONDITION_THREE: {
    // account var not needed here
  }
  case CONDITION_FOUR: {
    int account = 90384;
  }
}

, чтобы поместить блок вокруг каждого набора выполняемых операторов, чтобы поместить каждую переменную account в ее собственную область.Но почему язык не делает это для меня?

Почему вы хотите объявить локальную переменную в теле CONDITION_ONE, а затем использовать ее в CONDITION_TWO?Это похоже на УЖАСНУЮ идею, которая должна быть явно запрещена, а не явно разрешена.

Ответы [ 8 ]

6 голосов
/ 27 августа 2010

С чего бы вам хотеть этого?Если вам нужна новая область для каждого блока дел, вы делаете слишком много в блоке дел.Оттолкнись к методу.

5 голосов
/ 27 августа 2010

Это было бы несовместимо с остальной частью языка.

Как таковая, область действия всегда определяется блоками. Такая согласованность облегчает чтение и поддержку Java.

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

Потому что так работает C, а Java была разработана для того, чтобы заманить программистов на C.

2 голосов
/ 27 августа 2010

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

Один Блок, чтобы управлять ими всеми, Один Блок, чтобы найти их,
Один блок, чтобы привести их всех и в темноте связать их

2 голосов
/ 27 августа 2010

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

1 голос
/ 27 августа 2010

К счастью для вас, вам не нравится это поведение в хорошей компании - Джон Скит согласен с вами :)

Да, я знаю, что ссылка на вопрос о C, но это поведение Java унаследовано от правил области видимости блока C.

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

Ответ, как говорили другие - более или менее - потому что так все и происходит.

Возможно, Том Тресански действительно имел в виду, как достичь желаемого эффекта.

switch(condition) {
  case CONDITION_ONE:
    { int account = 27373; }
  case CONDITION_TWO:
    // account var not needed here
  case CONDITION_THREE:
    // account var not needed here
  case CONDITION_FOUR:
    { int account = 90384; }
}
0 голосов
/ 27 августа 2010

Потому что вы можете сделать это:

switch(condition) {
  case CONDITION_ONE:
    int account = 27373;
  case CONDITION_TWO:
    DoStuffHere();
  case CONDITION_THREE:
  case CONDITION_FOUR:
    DoMoreStuffHere();
}

тогда, и с этим ... если вы получили "CONDITION_ONE", тогда переменная будет установлена, и будут вызваны и DoStuffHere, и DoMoreStuffHere. Но если в противном случае вы получили CONDITION_THREE, то будет вызван только DoMoreStuffHere.

...