Почему переменные, определенные в блоке case, доступны в других блоках case? [дубликат]
Возможные Дубликаты:
почему переменные не являются локальными в операторах case?
переменная, определенная в блоке области, не может использоваться вне его. Например, недопустим следующий фрагмент кода:
{
int anothervar = 4;
}
{
System.out.println(anothervar);
}
но это похоже на case
блок не создает отдельные области.
switch (mode) {
case ONE:
dosomething();
return;
case TWO:
int[] someints = new int[] { 2, 3, 5, 7 };
SomeObject obj = new SomeObject();
return;
case THREE:
someints = new int[] { 1, 4, 6, 8, 9 };
obj = new SomeObject();
return;
}
почему бы мне не объявить someints
внутри case THREE
"блок"?
Предполагать mode = THREE
, затем объявление переменной someints
никогда не достигается, потому что case TWO
, где someints
объявлено, пропущено. Или нет? как это работает внутри?
(выбранный ответ в почему переменные не являются локальными в операторах case? заявляет, что оператор switch является внутренним набором jump
команды, но все равно это не объясняет, где переменная someints
объявлена.)
5 ответов
объем локальной переменной внутри блока, как указано в имена документация:
область объявления локальной переменной в блоке (§14.4.2) является остальная часть блока, в котором появляется объявление, начиная с собственный инициализатор (§14.4) и включение любых дополнительных деклараторов в прямо в инструкции объявления локальной переменной.
блок определен для того чтобы иметь заключая расчалки, как написано также внутри the блоки и заявления документация:
блок-это последовательность операторов, локальных объявлений классов и операторы объявления локальных переменных в фигурных скобках.
область объявления помечена { ... }
и вы можете упасть из одного случая в секунду. Я признаю, что это дыра. Я считаю, что в более старой версии Java не было разрешено объявлять на
в дополнение к другим ответчикам (как они заметили, область между {} здесь только одна) я хотел бы заметить, что такая практика: объявление переменной в одном случае и использование ее в другом, является грязный. Позже вы можете удалить или изменить какой-либо случай. И если это будет тот, с декларацией, вам придется изменить другой случай. Это может привести к ошибкам.
подумайте хорошенько-почему ваша переменная someints должна быть в обоих случаях? Это действительно одно и то же или два разных?
Если это то же самое: Лучше объявить общие переменные в случае по умолчанию и поместить его в качестве первого.
switch (mode) {
default:
int[] someints;
return;
case ONE:
dosomething();
return;
case TWO:
someints = new int[] { 2, 3, 5, 7 };
SomeObject obj = new SomeObject();
return;
case THREE:
someints = new int[] { 1, 4, 6, 8, 9 };
obj = new SomeObject();
return;
}
или объявить их из блока коммутатора (это хуже). Или поместите его где-нибудь, где вы определяете константы.
если они действительно разные переменные (могут быть только похожи в некотором роде): определите в каждом случае другую переменную.
кстати: это действительно хороший вопрос!
все, что внутри { }
находится в той же области. Если вы достанете return;
в случае два, например, вы можете использовать переменную в случае три, если она инициализирована.