2015-10-16 3 views
4

Я читаю эффективную Java-версию Дж. Блоха, и теперь я в разделе о инициализации локальных переменных. Вот что он сказал:Понимание инициализации локальной переменной

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

Итак, как насчет заявления if-else? Нам необходимо инициализировать переменную, только если какое-то условие выполнено, и инициализировать его по-другому, если это не так, как

MyClass mc = null; 
if(cond) 
    mc = new MyClass(); 
else 
    mc = new MyClass(1); 
//use mc 

Поскольку это не упоминается J. Bloch, это рассматривается как плохой техникой программирования и этого следует избегать?

+2

Я не уверен, что «одно исключение» означает «единственное исключение» или «одно из исключений». Наверное, это последнее. – mezzodrinker

+0

@ flashdrive2049 Может быть, но не в этом разделе ... –

ответ

4

На мой взгляд, самый чистый путь должен быть:

final MyClass mc; 
if (cond) { 
    mc = new MyClass(); 
} else { 
    mc = new MyClass(1); 
} 
//use mc 

Поскольку окончательное слово будет убедиться, что переменная всегда будет инициализирован только один раз (для детального объяснения, смотрите в книге на Пункт 15: Минимизируйте изменчивость, стр. 73).

И это то, что вы не можете сделать в обычных утверждениях try-catch.

Кроме того, он более эффективен и безопасен для always use curly braces.

+0

Действительно, хороший совет. Большое спасибо. –

1
MyClass mc = null; 

Это своего рода избыточно. Поскольку переменная mc всячески собирается инициализировать либо в if, либо else. поэтому вы можете избежать этого.

Если вы инициализировали два разных объекта в части if и else, тогда вы должны инициализировать его при объявлении, чтобы вы знали, чего ожидать от конкретной переменной позже в вашей программе.

1

Если использование переменной находится за пределами блока if-else, ваше объявление в порядке.

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

Сфера применения должна определять инициализацию и объявление переменной.

2

Вы должны были инициализировать переменную независимо от того, что до ее использования.

Если анализ компилятора обнаруживает, что переменная инициализирована до ее использования, вы можете определить переменную без инициализации.

Например

int a; 
if (...) { a = 0; } 
else { a = 1;} 

будет хорошо. Однако

int a; 
if (...) { a = 0; } 

приведет к ошибке компиляции, как условие не может стать реальностью, в этом случае «а» остается неинициализированным.

Лично я предпочитаю '?' оператор в тех случаи, как показано в коде:

MyClass mc = cond ? new MyClass() : new MyClass(1); 

Если вам нужен опорный «» тс вне сферы, где она инициализируется (КРП/другой блок), вы должны сделать это таким образом. Он не знает, что это считается плохой практикой.Однако в вашем конкретном случае лучшее решение может быть возможным, но это трудно сказать, не зная всего кода.