Должен ли мы всегда иметь конструктор с нулевым аргументом в классе? - PullRequest
19 голосов
/ 16 августа 2010

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

Ответы [ 4 ]

22 голосов
/ 16 августа 2010
нет

Нет

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

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

10 голосов
/ 16 августа 2010

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

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

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

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

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

  1. Использование шаблона Builder.
  2. Предоставить специализированные объекты-контейнеры для настройки экземпляра с помощью конструктора.
  3. Укажите несколько конструкторов, в которых базовые аргументы каждого являются обязательными параметрами, которым не могут быть назначены значения по умолчанию.
4 голосов
/ 16 августа 2010

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

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...
}
3 голосов
/ 16 августа 2010

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

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