Должен ли каждый класс Java иметь конструктор с нулевым аргументом?
Должен ли всегда иметь конструктор с нулевым аргументом в классе?
Ответ 1
Нет
Если нет смысла создавать экземпляр класса без предоставления какой-либо информации конструктору, то вам не нужно иметь конструктор с нулевым аргументом.
Хорошим примером является java.awt.Color класс, все аргументы которого указаны.
Ответ 2
Нет, нет смысла всегда создавать конструкторы нулевых аргументов, следующие сценарии являются примерами, когда имеет смысл предоставить конструктор по крайней мере a-some-argument-constructor
- Необходимые зависимости, которые сам класс не может создать.
- Для свойств не существует смысла по умолчанию.
Случаи, в которых вы хотите иметь конструктор нулевого аргумента:
- Вы хотите выполнить спецификацию JavaBeans (имеет смысл для простых объектов данных).
- Все поля могут быть инициализированы с использованием точных значений по умолчанию.
- Вы хотите использовать инфраструктуру, которая ему нужна.
Один из ошибочных аргументов для конструктора с нулевым аргументом, на мой взгляд, является длинным списком аргументов. Для этого есть более эффективные решения, чем принятие инициализации объекта, который не находится в безопасном состоянии после создания:
- Использование шаблона Builder.
- Предоставлять специализированные объекты контейнера для настройки экземпляра через конструктор.
- Предоставить несколько конструкторов, где базовые аргументы каждого из них являются требуемыми параметрами, которые не могут быть назначены по умолчанию.
Ответ 3
Как уже отмечал Энди Томас-Крамер, это даже невозможно:
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
Нет. Однако есть исключения. Например, если вы намереваетесь, чтобы ваш класс содержал только статические методы использования или один или один класс с просто константами, тогда вы должны создать частный конструктор без аргументов, чтобы предотвратить его явное создание.