2016-04-26 2 views
6

В исходном коде андроида я вижу, что они определяют четыре переменные, какИнициализировать int до 0 или нет?

protected int mPaddingRight = 0; 
protected int mPaddingLeft = 0; 
protected int mPaddingTop; 
protected int mPaddingBottom; 

В Java, в чем разница при инициализации переменной в 0 или нет? Я не понимаю, что в некоторых компиляторах я не могу выполнить сравнение, если я не инициализирую это поле. Но это не так. Это связано с оптимизацией? Или это просто непоследовательная/плохая практика кодирования?

+2

Никакие отличия - int члены инициализируются до нуля по умолчанию. –

+1

Я бы все же инициализировал '0', если бы я хотел, чтобы они были 0. И поскольку я это делаю, вам тоже нужно! – Gendarme

ответ

8

Согласно Java primitive data types turorial, все примитивные типы данных имеют значение по умолчанию. Таким образом, инициализация подразумевается. Хорошая практика: инициализировать значения перед использованием, чтобы предотвратить неожиданное поведение. не

byte 0 
short 0 
int 0 
long 0L 
float 0.0f 
double 0.0d 
char '\u0000' 
String (or any object)  null 
boolean false 
+0

Ничего себе, много замечательных ответов. Поэтому я выбираю самый старый и голос остальных. –

1

Как было отмечено в комментариях, нет нет никакой разницы. Они будут неактивизированы с помощью 0. Однако, если вы используете хорошую среду IDE или имеете другие инструменты, вам будет очень легко искать и заменять = 0;= SomeOtherValueHere;.

Кроме того, я считаю, что всегда полезно начинать свои переменные перед их доступом.

1

Это хорошая практика кодирования для инициализации переменных.

От Oracle Docs:

Это не всегда необходимо, чтобы присвоить значение, когда поле объявлено. Поля, объявленные, но не инициализированные, будут установлены в разумным по умолчанию компилятором. Вообще говоря, это значение по умолчанию будет равно нулю или нулевому, в зависимости от типа данных. Однако, полагаясь на такие значения по умолчанию, обычно считается плохое программирование .

Преимущество инициализация переменных являются следующим:

  1. делает его легче следовать коду
  2. делает жизнь проще для инструментов статического анализа.
  3. Большинство распространенных шаблонов проектирования запрашивают инициализацию переменной до значения по умолчанию, так что программист точно знает, какое значение инициализируется переменной.
  4. Это всегда хорошая практика для инициализации переменных, чтобы предотвратить неопределенное поведение позже в программе.
  5. Отладка упрощается, если вы инициализируете переменные.
+0

Хм. Здесь нет точно «неопределенного поведения». Все хорошо указано. Инструменты статического анализа также могут справиться с этим. – Thilo

0

Другие указали, что свойства класса инициализируются значениями по умолчанию для вас.

Таким образом, семантический, нет никакой разницы, если вы установите их в явном виде 0 (или, для свойств объекта, установите те пустое значение.)

Тем не менее, на самом деле может быть разницей на уровне байт-коды. Нет никакой гарантии, что код, который отличается только свойствами класса, которые неявно void явно заданы значениями по умолчанию, будет иметь точно такой же байт-код.

Старые версии JDK используются для генерации более крупного и более длинного кода для явной инициализации, что было легко проверить с помощью javap. (Этот факт иногда использовался в качестве основы для вопросов интервью.) Я не проверял последние версии JDK, чтобы убедиться, что это все еще так.

+0

Что касается того, хотите ли вы _should_ инициализировать свойства класса таким образом, даже если они уже известны значениям по умолчанию, это наступает на территорию священной войны. Мои чувства заключаются в том, что явные инициализаторы по умолчанию являются помехами и должны быть опущены. Если для свойства требуется инициализатор не по умолчанию, и дизайн не хочет статических инициализаторов или конструкторов (по какой-либо причине), то я полагаю, что это можно сделать, если есть комментарии, почему используются магические значения. Тем не менее, каждый магазин Java, в котором я работал, никогда не делал этого. Тем не менее, разработчики C# инициализируют _everything_. – jdv

+0

Более длинный код для явной инициализации? И я думал, что знаю Java: D –

Смежные вопросы