Я должен сохранить переменные экземпляра в Java всегда инициализируемыми или нет?

Webpack поддерживает Модули CSS как способ расширения приложения. Использование CSS-модулей также поможет вам получить пространство имен.

В конфигурации вашего веб-пакета:

{
  test: /\.css$/,
  loader: 'style!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]' 
}

Материал внутри [ ] должен быть настроен для вашего приложения.

Вот демо-проект репо

5
задан starblue 13 February 2009 в 10:03
поделиться

12 ответов

Я обычно рассматриваю пустой набор и пустой набор как две отдельных вещи:

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

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

9
ответ дан 18 December 2019 в 06:23
поделиться

Прежде всего все незаключительные переменные экземпляра должны быть объявлены частные, если Вы хотите сохранить контроль!

Рассмотрите ленивое инстанцирование также - это также избегает "плохого состояния", но только инициализирует после использования:

class Foo {
    private List<X> stuff;
    public void add(X x) {
        if (stuff == null)
            stuff = new ArrayList<X>();
        stuff.add(x);
    }
    public List<X> getStuff() {
        if (stuff == null)
            return Collections.emptyList();
        return Collections.unmodifiableList(stuff);
    }
}

(Отметьте использование Collections.unmodifiableList - если Вы действительно не хотите, чтобы вызывающая сторона смогла добавить/удалить из Вашего списка, необходимо сделать это неизменным),

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

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

Если Вы работаете с DI/МОК, Вы хотите, чтобы платформа сделала работу для Вас (хотя Вы могли сделать это посредством инжекции конструктора; я предпочитаю методы set) - Scott

4
ответ дан 18 December 2019 в 06:23
поделиться

Я сделал бы их окончательными, если это возможно. Затем они должны быть инициализированы в конструкторе и не могут стать пустыми.

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

2
ответ дан 18 December 2019 в 06:23
поделиться

Я сказал бы, что это прекрасно полностью - пока Вы помните, что у Вас есть "пустые" значения заполнителя там и не реальные данные.

Хранение их пустой указатель имеет преимущество того, чтобы вынуждать Вас иметь дело с ними - иначе катастрофические отказы программы. Если Вы создаете пустые объекты, но забываете их, Вы получаете неопределенные результаты.

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

3
ответ дан 18 December 2019 в 06:23
поделиться

Я столкнулся с некоторыми случаями, где это вызывает проблемы. Во время десериализации некоторые платформы не вызовут конструктора, я не знаю, как или почему они принимают решение сделать это, но это происходит. Это может привести к Вашему значению тому, чтобы быть null. Я также столкнулся со случаем, где конструктора вызывают, но по некоторым причинам членские переменные не инициализируются.

На самом деле я использовал бы следующий код вместо Вашего:

public class ItemManager {

  ItemMaster itemMaster = new ItemMaster();
  List<ItemComponentManager> components = new ArrayList<ItemComponentManager>();

  ItemManager() {
     ...
  }
  ...
}
2
ответ дан 18 December 2019 в 06:23
поделиться

Путем я имею дело с любой переменной, которую я объявляю, должен решить, переключит ли она время жизни объекта (или класс, если это статично). Если ответ является "нет" затем, я делаю его финалом.

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

  private final ItemMaster itemMaster;
  private final List components;

  // instance initialization block - happens at construction time
  {
      itemMaster = new ItemMaster();
      components = new ArrayList();
  }

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

2
ответ дан 18 December 2019 в 06:23
поделиться

Да, это - очень хорошая идея инициализировать все переменные класса в конструкторе.

1
ответ дан 18 December 2019 в 06:23
поделиться

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

Все еще необходимо проверить на пустой указатель. Сторонние библиотеки и даже Java API будут иногда возвращать пустой указатель.

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

1
ответ дан 18 December 2019 в 06:23
поделиться

Объект должен быть на 100% готовым к употреблению после того, как он будет создан. Пользователям не придется проверять на пустые указатели. Безопасное программирование является способом пойти - сохраняют проверки.

В интересах DRY можно поместить регистрации методов set и просто иметь вызов конструктора их. Тем путем Вы не кодируете проверки дважды.

1
ответ дан 18 December 2019 в 06:23
поделиться

Что происходит, если в одном из Ваших методов Вы устанавливаете

itemMaster = null; 

или Вы возвращаете ссылку на ItemManager к некоторому другому классу, и это устанавливает itemMaster как пустой указатель. (Можно принять меры, это легко возвращает клон ItemManager и т.д.),

Я сохранил бы проверки, поскольку это возможно.

0
ответ дан 18 December 2019 в 06:23
поделиться

Если это - весь Ваш код, и Вы хотите установить ту конвенцию, это должна быть хорошая вещь иметь. Я соглашаюсь с комментарием Paul, тем не менее, что ничто не предотвращает некоторый ошибочный код от случайной установки в NULL одной из Ваших переменных класса. Как правило я всегда проверяю на пустой указатель. Да, это - ЛАВАШ, но защитное кодирование может быть хорошей вещью.

0
ответ дан 18 December 2019 в 06:23
поделиться

С названия класса "ItemManager" ItemManager походит на одиночный элемент в некотором приложении. Раз так необходимо заняться расследованиями и действительно, действительно, знать Внедрение зависимости. Используйте что-то как Spring (http://www.springsource.org/), чтобы создать и ввести список ItemComponentManagers в ItemManager.

Без DI Инициализация вручную в серьезных приложениях является кошмаром для отладки, и соединяющий различные классы "менеджера" для создания узкие тесты ад.

Используйте DI всегда (создавая тесты). Для объектов данных создайте получение () метод, который создает список, если это не существует. Однако, если объект сложен, почти наверняка найдет Вашу жизнь лучше с помощью шаблона Фабрики или Разработчика и иметь F/B, устанавливает членские переменные по мере необходимости.

0
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: