Когда вам требуется конструктор (аналогично рассмотрите фабрики) для объекта, вы заставляете код, используя ваш объект, передавать основные требования конструктору. Чем яснее, тем лучше. Вы можете оставить необязательные поля для последующей настройки (ввода) с помощью установщика.

я нашел

эта статья в 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() );
      }

      //...
  }