1. Обзор
В этом коротком руководстве мы увидим, как связать конструкторы в Java . Это удобный шаблон проектирования, который создает меньше дублированного кода и делает его более читабельным.
Во-первых, мы объясним, что такое цепочка конструкторов . Затем мы увидим, как объединить их в цепочку в одном классе и использовать конструкторы из родительского класса. И последнее, но не менее важное: мы проанализируем преимущества и недостатки этого подхода.
2. Определение цепочки конструкторов с примерами
Цепочка конструкторов — это процесс вызова последовательности конструкторов . Мы можем сделать это двумя способами:
- используя ключевое слово
this()
для объединения конструкторов в одном классе - с помощью ключевого слова
super()
для цепочки конструкторов из родительского класса
Давайте посмотрим на примеры, демонстрирующие оба подхода.
2.1. Цепочка конструкторов внутри одного класса
Давайте определим простой класс Person
, содержащий несколько атрибутов:
public class Person {
private final String firstName;
private final String middleName;
private final String lastName;
private final int age;
//getters, equals and hashcode
}
firstName , lastName
и age
— это атрибуты, которые мы хотим всегда устанавливать во время инициализации объекта .
Однако не у каждого человека есть второе имя. Поэтому атрибут middleName
является необязательным.
``
Имея это в виду, мы собираемся создать два конструктора. Первый принимает все четыре атрибута:
public Person(String firstName, String middleName, String lastName, int age) {
this.firstName = firstName;
this.middleName = middleName;
this.lastName = lastName;
this.age = age;
}
Второй конструктор будет принимать три обязательных атрибута и опускать необязательное поле:
public Person(String firstName, String lastName, int age) {
this(firstName, null, lastName, age);
}
Мы используем ключевое слово this()
. Это всегда должна быть первая строка конструктора . Это гарантирует, что конструктор, к которому мы привязываемся, будет вызываться в первую очередь.
Имейте в виду, что порядок конструкторов в классе не имеет значения. Это означает, что наш второй конструктор можно разместить в любом месте класса Person
, и он все равно будет работать корректно.
2.2. Цепочка конструкторов из родительского класса
Давайте определим класс Customer
, который наследуется от класса Person
, созданного в предыдущем разделе:
public class Customer extends Person {
private final String loyaltyCardId;
//getters, equals and hashcode
}
Он содержит дополнительный атрибут. Теперь давайте создадим два конструктора так же, как в классе Person
:
public Customer(String firstName, String lastName, int age, String loyaltyCardId) {
this(firstName, null, lastName, age, loyaltyCardId);
}
public Customer(String firstName, String middleName, String lastName, int age, String loyaltyCardId) {
super(firstName, middleName, lastName, age);
this.loyaltyCardId = loyaltyCardId;
}
Первый конструктор использует ключевое слово this()
для связывания со вторым конструктором, который принимает все обязательные и необязательные атрибуты. Здесь мы впервые используем ключевое слово super() .
Его поведение очень похоже на ключевое слово this()
. Единственное отличие состоит в том, что super()
связывается с соответствующим конструктором в родительском классе, тогда как this()
связывается с конструктором в том же классе .
Имейте в виду, что аналогично предыдущему ключевому слову super()
всегда должно быть первой строкой конструктора . Это означает, что родительский конструктор вызывается в первую очередь. После этого значение присваивается атрибуту лояльностиCardId
.
3. Преимущества и недостатки объединения конструкторов
Самым большим преимуществом цепочки конструкторов является меньше дублированного кода . Другими словами, мы используем принцип «Не повторяйся» ( DRY ). Это связано с тем, что инициализация объекта выполняется в одном конструкторе, обычно принимающем все атрибуты. Другие конструкторы предназначены только для передачи полученных данных и добавления значений по умолчанию для отсутствующих атрибутов.
Цепочка конструкторов делает код более читабельным. Нам не нужно повторять присвоение атрибутов во всех конструкторах. Вместо этого мы делаем это в одном месте.
С другой стороны, мы предоставляем больше способов создания объекта при использовании цепочки конструкторов . Это может быть существенным недостатком в некоторых проектах. В этих случаях мы должны искать шаблоны фабрики или построителя , чтобы скрыть несколько конструкторов.
4. Вывод
В этой статье мы обсудили цепочку конструкторов в Java . Во-первых, мы объяснили, что называется цепочкой конструкторов. Затем мы показали, как это сделать с помощью конструкторов внутри одного класса, а также с помощью родительских конструкторов. Наконец, мы обсудили преимущества и недостатки цепочек конструкторов.
Как всегда, полный исходный код статьи доступен на GitHub .