Инстанцировать объекты при инициализации? - PullRequest
3 голосов
/ 30 марта 2012

У меня есть класс, который содержит другие объекты внутри него (List, Set и объекты из моего приложения).

public class SomeClass {
    private List l;
    private SomeObject obj;
    //...
}

Рекомендуется ли создавать экземпляры этих объектов при создании объекта SomeClass, чтобы избежать исключения NullPointerException? Что-то вроде:

public class SomeClass{
    private List l = new ArrayList();
    private SomeObject obj = new SomeObject();
    //...
}

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

Ответы [ 6 ]

2 голосов
/ 30 марта 2012

Да, это хорошая практика.Конструктор - это естественное место для создания объектов-членов.Вы также можете создать их прямо там, где они объявлены:

private List l = new ArrayList();

Однако, было бы неплохо реструктурировать или изменить ваш код так, чтобы NullPointerException s не возникало, независимо от порядка вкоторые методы называются.

1 голос
/ 30 марта 2012

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


Вы также можете назначить некоторые состояния по умолчанию - например, Collections.emptyList () или в константахкласс:

DEFAULT_STATE = new SomeState();

тогда просто

class A { 
      State obj = Constants.DEFAULT_STATE;
   }
1 голос
/ 30 марта 2012

Вы говорите о стремительном строительстве против ленивого строительства.Есть места, где у каждого есть ценность.

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

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

1 голос
/ 30 марта 2012

Обычно рекомендуется создавать экземпляры полей-членов (объектов или примитивов) во время создания, когда значение по умолчанию (0, false или null) не соответствует желаемому. Один раз, чтобы отложить это для ленивого экземпляра. (Это используется, например, когда объект может и не понадобиться, а его создание стоит дорого.) Еще один раз отложить это, когда другая инициализация должна быть выполнена заранее.

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

Также рекомендуется объявлять поля-члены final всякий раз, когда они инициализируются при создании объекта и, как ожидается, не изменятся в течение срока службы объекта. Дополнительным преимуществом объявления поля final является то, что компилятор поймает любой сбой при его инициализации. (Компилятор требует определенного присваивания, чтобы считать поле final должным образом инициализированным.)

1 голос
/ 30 марта 2012

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

Надеюсь, это поможет вам.

1 голос
/ 30 марта 2012

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

...