Перейти к основному содержимому

Цепочка конструкторов в Java

· 4 мин. чтения

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 .