Хорошее решение - сделать поля final
, добавить конструктор private
и использовать Builders
в своем коде.
В нашем проекте мы объединили шаблон Builder
с каркасом проверки, чтобы после создания объекта мы были уверены, что он неизменен и действителен.
Вот краткий пример:
public class Person {
public static class Builder {
private String firstName;
private String lastName;
private final List<String> addresses = new ArrayList<String>();
private final List<String> phones = new ArrayList<String>();
public Person create() {
return new Person(firstName, lastName, addresses, phones);
}
public Builder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder setLastName(String lastName) {
this.lastName = lastName;
return this;
}
public Builder addAddresse(String adr) {
if (adr != null) {
addresses.add(adr);
}
return this;
}
public Builder addPhone(String phone) {
if (phone != null) {
phones.add(phone);
}
return this;
}
}
// ************************ end of static declarations **********************
private final String firstName;
private final String lastName;
private final List<String> addresses;
private final List<String> phones;
private Person(String firstName, String lastName, List<String> addresses, List<String> phones) {
this.firstName = firstName;
this.lastName = lastName;
this.addresses = addresses;
this.phones = phones;
}
public List<String> getAddresses() {
return Collections.unmodifiableList(addresses);
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public List<String> getPhones() {
return Collections.unmodifiableList(phones);
}
}
В моем примере вы можете видеть, что все сеттеры в Builder
возвращают экземпляр Builder
, чтобы вы могли легко связывать вызовы сеттеров. Это очень полезно.
Вы можете взглянуть на образец Строителя, представленный Джошуа Блохом.
Как я уже говорил, в сочетании с платформой проверки (см., Например, http://www.hibernate.org/subprojects/validator.html), это действительно мощно.