Возможно, стоит подумать об использовании статического фабричного метода вместо конструктора.
Я говорю вместо, но очевидно, что вы не можете заменить конструктор. Однако вы можете скрыть конструктор за статическим фабричным методом. Таким образом, мы публикуем статический фабричный метод как часть API класса, но в то же время мы прячем конструктор, делая его закрытым или закрытым для пакета.
Это достаточно простое решение, особенно по сравнению с шаблоном Builder (как показано в Effective Java 2nd Edition Джошуа Блоха — будьте осторожны, шаблоны проектирования Gang of Four определяют совершенно другой дизайн. шаблон с тем же именем, так что это может немного сбивать с толку), что подразумевает создание вложенного класса, объекта-строителя и т. д.
Этот подход добавляет дополнительный уровень абстракции между вами и вашим клиентом, усиливая инкапсуляцию и упрощая внесение изменений в будущем. Это также дает вам контроль над экземплярами — поскольку объекты создаются внутри класса, вы, а не клиент, решаете, когда и как эти объекты создаются.
Наконец, это упрощает тестирование — предоставляя тупой конструктор, который просто присваивает значения полям, не выполняя никакой логики или проверки, он позволяет вам ввести недопустимое состояние в вашу систему, чтобы проверить, как она ведет себя и реагирует на это. Вы не сможете этого сделать, если вы проверяете данные в конструкторе.
Вы можете прочитать гораздо больше об этом в (уже упоминавшейся) книге Джошуа Блоха Effective Java 2nd Edition — это важный инструмент во всех наборах инструментов разработчика, и неудивительно, что он является предметом первой главы книги. ;-)
По вашему примеру:
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);
}
...
}
Какой бы способ вы ни выбрали, рекомендуется иметь один конструктор main, который просто вслепую присваивает все значения, даже если он только что используется другими конструкторами.
person
Krzysiek Przygudzki
schedule
14.09.2017