Должны ли мы всегда иметь конструктор с нулевым аргументом в классе?

Должен ли каждый класс Java иметь конструктор с нулевым аргументом?

19
задан user421814 17 August 2010 в 05:27
поделиться

4 ответа

Нет

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

Хорошим примером является класс java.awt.Color , все ctors которого аргументированы.

22
ответ дан 30 November 2019 в 03:24
поделиться

Нет, не имеет смысла всегда создавать конструкторы с нулевым аргументом, следующие сценарии являются примерами, в которых имеет смысл предоставить по крайней мере конструктор-некоторый-аргумент

  1. Обязательные зависимости что сам класс не может создать.
  2. Для свойств нет разумных значений по умолчанию.

Случаи, когда вы хотите иметь / нуждаетесь в конструкторе без аргументов:

  1. Вы хотите соответствовать спецификации JavaBeans (имеет смысл для простых объектов данных).
  2. Все поля могут быть инициализированы с использованием разумных значений по умолчанию.
  3. Вы хотите использовать платформу, которая в этом нуждается.

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

  1. Использование шаблона Builder.
  2. Предоставьте специализированные объекты-контейнеры для настройки экземпляра через конструктор.
  3. Предоставьте несколько конструкторов, в которых базовые аргументы каждого из них являются обязательными параметрами, которым не могут быть присвоены значения по умолчанию.
10
ответ дан 30 November 2019 в 03:24
поделиться

Как уже заметил Энди Томас-Крамер, это даже невозможно:

class NeedsToBeImmutable {
    // For a class to be immutable, its reachable state
    // MUST be reached through a final field
    private final String stuff;

    //!!Compile error!!
    public NeedsToBeImmutable(){}

    public NeedsToBeImmutable(String stuff){
    this.stuff = stuff;
    }
    //getters...
}
4
ответ дан 30 November 2019 в 03:24
поделиться

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

3
ответ дан 30 November 2019 в 03:24
поделиться
Другие вопросы по тегам:

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