Когда вам требуется конструктор (аналогично рассмотрите фабрики) для объекта, вы заставляете код, используя ваш объект, передавать основные требования конструктору. Чем яснее, тем лучше. Вы можете оставить необязательные поля для последующей настройки (ввода) с помощью установщика.
эта статья в JavaWorld, где Аллен Голуб объясняет альтернативу Getters / Setters, которая поддерживает принцип, что реализация объекта должна быть скрыта (его пример кода также можно найти ниже).Объясняется, что классы
должен иметь конструктор, принимающий одну строку - причина в том, что если вы наберете его какName
/EmployeeId
/Money
и позже нужно поменять его наint
вам придется изменить все виды использования класса, и с этим шаблоном вам не нужно.long
Вопрос 1:
параметры подбрасываются? Например, если весь код, использующийString
(получено отEmployeeId
разбираетExporter
вString
и вдруг вы начинаете экспортироватьint
значения, вам нужно изменить столько же вариантов использования ... и если вы начинаете анализировать его какlong
вполне возможно, придется изменить наlong
(хотя это не имеет смысла для идентификаторов) ... и если вы не можете быть уверены, что анализироватьdouble
в тебяString
не могу ничего реализоватьВопрос 2:.
Листинг 1. Сотрудник: контекст Builder
это похоже на ужасное количество дополнительного кода, чтобы избежать геттеров и сеттеров public class Employee
{ private Name name;
private EmployeeId id;
private Money salary;
public interface Exporter
{ void addName ( String name );
void addID ( String id );
void addSalary ( String salary );
}
public interface Importer
{ String provideName();
String provideID();
String provideSalary();
void open();
void close();
}
public Employee( Importer builder )
{ builder.open();
this.name = new Name ( builder.provideName() );
this.id = new EmployeeId( builder.provideID() );
this.salary = new Money ( builder.provideSalary(),
new Locale("en", "US") );
builder.close();
}
public void export( Exporter builder )
{ builder.addName ( name.toString() );
builder.addID ( id.toString() );
builder.addSalary( salary.toString() );
}
//...
}