Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Switch: использование фигурных скобок в case перед break

#java #android


public void onClick(View v) {
    switch (v.getId()) {
        case R.id.start:
            {
                Intent intent = new Intent();
                intent.setClass(this, Menu.class);
                startActivity(intent);
            }
            break;  
        case R.id.records: 
            Intent intent = new Intent();
            intent.setClass(this, RecordList.class);
            startActivity(intent);
            break;   
    }
}


В обработке первой кнопки есть фигурные скобки, хотел бы понять как они в данном
случае работают. Если их убрать, то будет жалоба на то, что два одинаковых названия
intent, пусть даже стоит оператор break. Если я вдруг напишу такой код, что первая
кнопка не будет переходить по созданному интенту и у меня будет возможность кликнуть
и по второй кнопке, то что-то нехорошее произойдет. 
    


Ответы

Ответ 1



{ ... } в данном случае - это просто (анонимный) блок кода. И сделано это, видимо, только для того, чтобы не было конфликта имён переменных. В этом ответе говорится, что использование таких блоков - это зачастую признак плохо написанного кода. Утверждение, конечно, можно считать спорным, но конкретно в этом случае создание Intent-а, а также вызовы методов setClass и startActivity можно вынести из switch-а, оставив в case-ах только выбор класса: Class clazz = null; switch (v.getId()) { case R.id.start: clazz = Menu.class; break; case R.id.records: clazz = RecordList.class; break; } if (clazz != null) { Intent intent = new Intent(); intent.setClass(this, clazz); startActivity(intent); }

Ответ 2



Пара фигурных скобок {...} задает границы блока кода. В Java переменные можно объявлять в любом блоке. Блок определяет область действия (видимости) переменных. В вашем примере три области видимости переменных (даже 4, если считать поля класса) вложенные друг в друга. public void onClick(View v) {// область 1 switch (v.getId()) {// область 2 case R.id.start:{//область 3 } } } В таком случае переменные, объявленные в области 1 доступны из области 2 и 3, переменные обхявленные в области 2 будут доступны в области 3, но не доступны в области 1. Однако перемынные из области 3 недоступны за пределом этой области. Например следующий код не скомпилируется пока не закомментируете строку 22, т.к переменная в этом месте уже не доступна public class FieldVisiblTester { //область1 - поля класса, видимы везде внутри класса String s1 = "string1"; public static void main(String[] args) { new FieldVisiblTester().method(); } void method(){ //область2 - локальные переменные метода, видимы внутри метода String s2 = "string2"; { //область3 - переменные блока кода, видимы внутри блока String s3 = "string3"; System.out.println("inside code block"); System.out.println(s1); System.out.println(s2); System.out.println(s3); } System.out.println("inside method"); System.out.println(s1); System.out.println(s2); //переменная s3 недоступна вне блока, где она объявлена System.out.println(s3); } } Ошибка FieldVisiblTester.java:22: error: cannot find symbol System.out.println(s3); symbol: variable s3 location: class FieldVisiblTester 1 error Еще интересный момент - в Java нельзя "скрывать/перекрывать" переменные блоком кода. Следующий код не скомпилируется (error: variable s2 is already defined in method method()) void method(){ //область2 - локальные переменные метода, видимы внутри метода String s2 = "string2"; { //область3 - переменные блока кода, видимы внутри блока // т.к s2 объявлена в "наружном" блоке, она видима и тут // т.е нельзя использовать то же имя String s2 = "string3"; } } Но можно сделать так void method(){ { String s2 = "string3"; } //вышли из блока кода, переменная s2 не видима //можно объявить еще раз String s2 = "string2"; }

Комментариев нет:

Отправить комментарий