Почему бы не использовать метод # 2
Ваш второй пример не рекомендуется, потому что, если вы добавили новое поле в класс Address, добавьте ли вы его в существующий метод setterили вы создаете новый метод установки?Если вы добавите его в существующий метод установки, все классы, вызвавшие этот метод, будут повреждены.И если вы создали новый метод сеттера, то для любого, кто хочет использовать этот класс, непонятно, почему некоторые поля группируются таким образом, а другие нет.
Использование отдельного метода сеттера для каждогополе, которое вы хотите раскрыть
Обычная практика - иметь один метод установки для каждого поля в вашем классе, которое вы хотите раскрыть (т. е. ваш первый пример).Является ли это хорошей практикой, является дискуссионным, поскольку она заставляет класс быть изменяемым. Лучше сделать объект неизменным, если это возможно, по ряду причин .
Инициализация ваших полей с помощью конструктора
Один из способов сделать класс неизменным - избавиться от методов установки и вместо этого сделать поля настраиваемыми с помощью конструктора классов, какниже.Недостатком реализации этого способа является то, что если в вашем классе много полей, это может привести к большим нечитаемым вызовам конструктора.
public class Address {
public String name;
public String city;
private Address(String name, String city) {
this.name = name;
this.city = city;
}
}
Инициализация полей с использованием шаблона Builder
Ниже приведена совершенно альтернативная реализация (вдохновленная этой статьей ), представляющая собой вариант шаблона Builder .Он имитирует изменчивость объекта без ущерба для читаемости.
public class Address {
public String name;
public String city;
private Address() {}
private void setName(String name) {
this.name = name;
}
private void setCity(String city) {
this.city = city;
}
static class Builder {
private Address address = new Address();
public Builder name(String name) {
address.setName(name);
return this;
}
public Builder city(String city) {
address.setCity(city);
return this;
}
public Address build() {
return address;
}
}
}
С помощью вышеуказанного класса вы можете создать неизменный экземпляр класса Address следующим образом:
Address address = new Address.Builder()
.name("Mansoor's address")
.city("Toronto")
.build();
Какой подход используетбольше памяти?
С точки зрения памяти не должно быть никакой разницы, так как размер класса в памяти зависит от полей в классе.Поскольку все три реализации имеют одинаковые поля, они должны занимать одинаковое количество места в памяти независимо от того, какой подход вы используете.