Я нашел эту статью на JavaWorld, где Аллен Холуб объясняет альтернативу геттерам / сеттерам, которая поддерживает принцип, согласно которому реализация объекта должна быть скрыта (его пример кода также можно найти ниже).
Объясняется, что классы Name
/ EmployeeId
/ Money
должен иметь конструктор, принимающий единственную строку - причина в том, что если вы введете его как int
, и позже необходимо изменить его на long
, вам придется изменить все способы использования класса, и с этим шаблон, который вам не нужен.
Мне было интересно: разве это не переносит проблему просто на анализ разбрасываемых параметров String
? Например, если весь код, использующий EmployeeId
(полученный от Exporter
), анализирует строку String
в int
], и вдруг вы начните экспортировать длинные
значения, вам нужно изменить ровно столько же применений ... и если вы начнете анализировать его как long
, ему, возможно, придется изменить на double
(даже если это не имеет смысла для идентификаторов) ... и если вы не можете быть уверены, что анализировать String
, вы не можете ничего реализовать .
Помимо этого вопроса, у меня есть еще один: я понимаю, что статье более семи лет, поэтому может ли кто-нибудь указать мне на некоторые недавние обзоры, касающиеся объектно-ориентированного дизайна,и конкретно к идеям, касающимся прений, касающихся геттеров / сеттеров и реализации?
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() );
}
//...
}