2009-12-16 4 views
3

Это null для Object type?Что представляют собой поля объектов java?

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

будет s всегда будет иметь значение null?

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

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

 
public void meth() { 
    int i; 
} 

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


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

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

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

ИЛИ

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

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

+0

Почему вы не запустили это через отладчик и не узнали? – Pat

+0

Ответ приведен ниже в моем комментарии. – EugeneP

ответ

19

От солнца java tutorial

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

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

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

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

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

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

+0

или false для booleans. – Thilo

+0

или null для объектов – Ash

+0

<< Кроме того, в вашем сеттере вам нужно будет убедиться, что кто-то не попытается установить его на нуль >> Тонны и тонны глупой работы. Конечно, я могу это сделать. Но это не то, что я ожидаю от стиля программирования. Предположим, вы должны сделать это для 1000 полей. – EugeneP

3

Поля: Объекты по умолчанию - null; ints, longs и shorts to 0; Строки в null; boolean - false. Это все here.

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

2

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

+3

.. хотя попытка имеет смысл, если вы уверены, инициализация поля определена и надежна. Конечно, мы знаем, что это так, и что компилятор не позволит вам идти туда, где это не так (локальные переменные). Но если вы не уверены и не знаете, где искать, тогда это стоит как вопрос, так и хороший ответ (BTW, +1). –

+2

-> откровенно говоря, вы могли бы попробовать этот. Это может быть НЕПТЕПЛИВНЫЙ ТЕСТ. Вы можете получить 0 тысяч раз. И затем, получите 4 миллиарда, когда память обновилась. – EugeneP

1

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

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

Или с коллекциями Google/Google гуавы:

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 установщика и/или класса.

+0

ну, preconditions.checknotnull выглядит очень Pretty !! Почему это не в стандартной java-библиотеке? это то, чего я ожидаю от Java. – EugeneP

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