Эта глава открывает новый раздел книги, посвященный общему программированию. Эта конкретная глава посвящена довольно простой концепции – минимизации области видимости локальной переменной. Преимущества, которые мы получаем, следуя этому, включают улучшенную читаемость, лучшую ремонтопригодность и снижение вероятности ошибок.
Один из советов, которым мы можем следовать и которые могут нам помочь, – это убедиться, что мы инициализируем локальные переменные при их объявлении. Это может быть полезно по целому ряду причин. Во-первых, мы уменьшаем наши шансы на исключения нулевого указателя, поскольку мы инициализируем переменную с места в карьер. Преимущество также заключается в том, что нам нужно ждать достаточно долго в методе, пока у нас не будет достаточно информации для инициализации. При этом существуют ситуации, когда мы не сможем инициализировать наши переменные, когда мы их объявляем. Например, когда мы используем try-catch
и переменная используется после catch, нам нужно объявить ее до того, как переменная будет инициализирована в try
. При этом мы работаем над инициализацией переменных, когда объявляем их, когда это возможно.
Еще одна тема, которая возникает, – это предпочтение циклов for
циклам while
. Причина этого заключается в том, что циклы for имеют свое собственное местоположение для инициализации переменных, которое имеет ограниченную область действия, ограниченную только циклом. Пример того, как циклы while могут вызывать проблемы, выглядит следующим образом:
Iteratori = c.iterator(); while(i.hasNext()) { doSomething(i.next()); } Iterator i2 = c2.iterator(); while(i.hasNext()) { doSomethingElse(i2.next()); }
Проблема с вышеизложенным заключается в том, что оно неверно и не выполняет то, что было задумано, но компилируется и даже не имеет исключения во время выполнения. Сравните это с версией цикла for:
for(Iteratori = c.iterator; i.hasNext();) { Element e = i.next(); // Do something with e and i } for(Iterator i2 = c2.iterator(); i.hasNext();){ Element e2 = i2.next(); // Do something with e2 and i2 }
Вышеприведенное даже не будет компилироваться потому что i
был ограничен только тем, что ему нужно. Вышесказанное можно даже улучшить еще больше, повторно используя имена переменных (поскольку они находятся в другой области видимости), и еще лучше, если вы не используете итератор напрямую, вы можете использовать цикл foreach.
Последний совет по сохранению малого объема – сохранить всю функцию небольшой. Если вся ваша функция невелика, то ваши локальные переменные должны иметь небольшую область видимости.
Оригинал: “https://dev.to/kylec32/effective-java-minimize-the-scope-of-local-variables-3e87”