С чем инициализируются поля Java-объектов? - PullRequest
7 голосов
/ 16 декабря 2009

Это null для Object типа?

class C {
    int i;
    String s;
    public C() {}
}

Будет ли s всегда null?

А как насчет простых типов как int? Что это будет? Ноль или произвольное значение?

А как насчет локальных переменных в методах?

public void meth() {
    int i;
}

Что такое унифицированное значение i?


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

Хорошо, что вы предлагаете делать?

class A {
    String s = "";
    int i = 0;
}

OR

class A {
    String s;
    int i;
    public A() {
        // default constructor
        s = "";
        i = 0;
    }
}

Что лучше и почему?

Ответы [ 5 ]

27 голосов
/ 16 декабря 2009

Из солнц Java-учебник

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

Следующая таблица суммирует значения по умолчанию для вышеуказанных данных типы.

Data Type   Default Value (for fields)
byte                    0 
short                   0   
int                     0 
long                    0L 
float                   0.0f 
double                  0.0d 
char                    '\u0000' 
boolean                 false
String (or any object)  null 

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

4 голосов
/ 16 декабря 2009

Для переменных-членов: Значением по умолчанию для String является null. Значением по умолчанию для примитивов является 0 (или 0,0 для значений с плавающей запятой).

Для локальных переменных: Вы должны явно инициализировать локальную переменную перед ее использованием.

Что касается второй части вашего вопроса: Вы всегда можете сказать String s = ""; в определении переменной-члена или s = ""; в конструкторе. Тогда вы знаете, что оно будет иметь ненулевое значение. (Кроме того, в вашем сеттере вы должны убедиться, что кто-то не пытается установить его обратно в ноль.)

3 голосов
/ 16 декабря 2009

Поля: Объекты по умолчанию равны нулю; целые, длинные и короткие шорты до 0; Строки в нуль; логическое значение ложно. Это все здесь .

Компилятор заставит вас инициализировать переменные, объявленные в методах, локальные переменные , самостоятельно.

2 голосов
/ 16 декабря 2009

Примитивные поля инициализируются в 0 / false. Объекты инициализируются до null. Но, честно говоря, вы могли бы попробовать это ..

1 голос
/ 16 декабря 2009

Что касается вопроса метода установки: весь смысл методов установки состоит в том, что они могут проверить, соответствует ли переданный объект требованиям класса. например,

public void setS(String s) {
  if (s == null)
     throw new IllegalArgumentException("S must not be null");
  this.s = s;
}

Или с помощью Google Collections / Google Guava:

public void setS(String s) {
  this.s = Preconditions.checkNotNull(s, "S must not be null");
}

Конечно, вы можете определить произвольные ограничения, например ::

/**
 * Sets the foo. Legal foo strings must have a length of exactly 3 characters.
 */
public void setFoo(String foo) {
  if (foo == null)
     throw new IllegalArgumentException("Foo must not be null");
  if (foo.length() != 3)
     throw new IllegalArgumentException("Foo must have exactly 3 characters");
  ...

Конечно, в таком случае вы должны всегда указывать правильный диапазон значений для ваших свойств в JavaDoc установщика и / или класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...