Шаблоны проектирования Java: конструктор
Каждый сталкивался с одной и той же проблемой при кодировании. Вам нужно создать объект, и у него есть огромный конструктор.
Пример:
User user = new User("1", "John", "Travolta", "amazing street", "2", "New York");
User.java
public class User { private String id; private String name; private String lastName; private String street; private String streetNumber; private String city; public User(String id, String name, String lastName, String street, String streetNumber, String city) { this.id = id; this.name = name; this.lastName = lastName; this.street = street; this.streetNumber = streetNumber; this.city = city; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getStreetNumber() { return streetNumber; } public void setStreetNumber(String streetNumber) { this.streetNumber = streetNumber; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
Шаблон строителя, чтобы спасти!
Мы можем сделать это проще, просто создав экземпляр с конкретными именами, которые вы хотите инициализировать, это легче читать и легче писать, поскольку мы можем точно определить, какая переменная будет иметь какое-либо значение.
Пример:
User user = new User.Builder() .id("2") .name("John") .lastName("Travolta") .street("amazing street") .streetNumber("2") .city("New York") .build();
Легче читать, да? Итак, давайте посмотрим немного подробнее!
Как видите, внутри User.java есть новый класс под названием «Builder», в примере User.Builder(), который делегирует создание экземпляра этому новому классу.
Пользователь.java
Примечание. Это не окончательная версия User.java, здесь вы можете увидеть новый класс внутри User.java.
public class User { public static class Builder { private String id; private String name; private String lastName; private String street; private String streetNumber; private String city; public Builder id(String id) { this.id = id; return this; } public Builder name(String name) { this.name = name; return this; } public Builder lastName(String lastName) { this.lastName = lastName; return this; } public Builder street(String street) { this.street = street; return this; } public Builder streetNumber(String streetNumber) { this.streetNumber = streetNumber; return this; } public Builder city(String city) { this.city = city; return this; } public User build() { return new User(this); } } }
Наиболее важной частью, которую вы можете оценить, является этот метод:
public User build() { return new User(this); }
Это тот, кто создает экземпляр, который нам нужен, но получает User.Builder в конструкторе, а затем может получить каждое значение из конструктора и создать экземпляр объекта. Вот часть User.java:
Пользователь.java
public class User { private String id; private String name; private String lastName; private String street; private String streetNumber; private String city; public User(User.Builder builder) { this.id = builder.id; this.name = builder.name; this.lastName = builder.lastName; this.street = builder.street; this.streetNumber = builder.streetNumber; this.city = builder.city; } }
Все вместе
В конце концов, ваш класс User будет выглядеть следующим образом:
Пользователь.java
public class User { private String id; private String name; private String lastName; private String street; private String streetNumber; private String city; public User(User.Builder builder) { this.id = builder.id; this.name = builder.name; this.lastName = builder.lastName; this.street = builder.street; this.streetNumber = builder.streetNumber; this.city = builder.city; } public static class Builder { private String id; private String name; private String lastName; private String street; private String streetNumber; private String city; public Builder id(String id) { this.id = id; return this; } public Builder name(String name) { this.name = name; return this; } public Builder lastName(String lastName) { this.lastName = lastName; return this; } public Builder street(String street) { this.street = street; return this; } public Builder streetNumber(String streetNumber) { this.streetNumber = streetNumber; return this; } public Builder city(String city) { this.city = city; return this; } public User build() { return new User(this); } } }