Возможно, стоит использовать статический заводский метод вместо конструктора.
Я говорю вместо, но, очевидно, вы не можете заменить конструктор. Однако вы можете скрыть конструктор за статическим заводским методом. Таким образом, мы публикуем статический заводский метод как часть API класса, но в то же время мы скрываем конструктор, делающий его закрытым или закрытым.
Это довольно простое решение, особенно в сравнении с шаблоном Builder (как показано в Джошуа Блоха Эффективное Java 2-е издание - берегитесь, Банда Design Patterns четверки определяют совершенно другой дизайн шаблона с таким же именем, так что может быть немного запутанным), что подразумевает создание вложенного класса, объекта-строителя и т. д.
Этот подход добавляет дополнительный уровень абстракции между вами и вашим клиентом, упрощает инкапсуляцию и облегчает внесение изменений в дорогу. Он также дает вам экземпляр-контроль - поскольку объекты создаются внутри класса, вы, а не клиент, решаете, когда и как создаются эти объекты.
Наконец, это облегчает тестирование - предоставление немого конструктора, который просто присваивает значения полям, не выполняя никаких логических или валидационных проверок, он позволяет ввести недопустимое состояние в вашу систему, чтобы проверить, как он ведет себя и реагирует на что. Вы не сможете это сделать, если вы проверяете данные в конструкторе.
Вы можете прочитать гораздо больше о том, что в (уже упоминалось) Джошуа Блоха Эффективное Java 2-е издание - это важный инструмент в инструментарии все девелоперские и не удивительно, это не предмет 1-й главе книги. ;-)
После вашего примера:
public class Book {
private static final String DEFAULT_TITLE = "The Importance of Being Ernest";
private final String title;
private final String isbn;
private Book(String title, String isbn) {
this.title = title;
this.isbn = isbn;
}
public static Book createBook(String title, String isbn) {
return new Book(title, isbn);
}
public static Book createBookWithDefaultTitle(String isbn) {
return new Book(DEFAULT_TITLE, isbn);
}
...
}
Какой бы путь вы ни выбрали, это хорошая практика, чтобы иметь один главный конструктор, который просто слепо присваивает все значения, даже если он просто используется другими конструкторами.
Это зависит от того, нужны ли все поля для хранения значения? – CodeMonkey
Эта статья может быть полезна: http://www.yegor256.com/2015/05/28/one-primary-constructor.html – yegor256
Мне не нравится, когда люди задают вопросы, а затем не принимают ответы. – muni764