Рубрики
Без рубрики

Эффективная Java: Минимизируйте область действия локальных переменных

Погружение в главу 57 “Эффективная Java”. Помеченный как java, эффективный, область применения, архитектура.

Эта глава открывает новый раздел книги, посвященный общему программированию. Эта конкретная глава посвящена довольно простой концепции – минимизации области видимости локальной переменной. Преимущества, которые мы получаем, следуя этому, включают улучшенную читаемость, лучшую ремонтопригодность и снижение вероятности ошибок.

Один из советов, которым мы можем следовать и которые могут нам помочь, – это убедиться, что мы инициализируем локальные переменные при их объявлении. Это может быть полезно по целому ряду причин. Во-первых, мы уменьшаем наши шансы на исключения нулевого указателя, поскольку мы инициализируем переменную с места в карьер. Преимущество также заключается в том, что нам нужно ждать достаточно долго в методе, пока у нас не будет достаточно информации для инициализации. При этом существуют ситуации, когда мы не сможем инициализировать наши переменные, когда мы их объявляем. Например, когда мы используем try-catch и переменная используется после catch, нам нужно объявить ее до того, как переменная будет инициализирована в try . При этом мы работаем над инициализацией переменных, когда объявляем их, когда это возможно.

Еще одна тема, которая возникает, – это предпочтение циклов for циклам while . Причина этого заключается в том, что циклы for имеют свое собственное местоположение для инициализации переменных, которое имеет ограниченную область действия, ограниченную только циклом. Пример того, как циклы while могут вызывать проблемы, выглядит следующим образом:

Iterator i = c.iterator();
while(i.hasNext()) {
  doSomething(i.next());
}

Iterator i2 = c2.iterator();
while(i.hasNext()) {
  doSomethingElse(i2.next());
}

Проблема с вышеизложенным заключается в том, что оно неверно и не выполняет то, что было задумано, но компилируется и даже не имеет исключения во время выполнения. Сравните это с версией цикла for:

for(Iterator i = 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”