JavaWorld en OO: Getters / Setters vs Builder

Antecedentes

EncontréEste artícul en JavaWorld, donde Allen Holub explica una alternativa a Getters / Setters que mantiene el principio de que la implementación de un objeto debe estar oculta (su código de ejemplo también se puede encontrar a continuación).

Se explica que las clasesName/EmployeeId/Money debería tener un constructor que tome una sola cadena; el razonamiento es que si lo escribe comoint, y luego necesita cambiarlo along, tendrá que modificar todos los usos de la clase, y con este patrón no tendrá que hacerlo.

Pregunta 1

e preguntaba: ¿esto simplemente no mueve el problema al análisis de laString parámetros lanzados sobre? Por ejemplo, si todo el código usa laEmployeeId (recibido de laExporter) analiza elString en unaint, y de repente comienzas a exportarlong valores, debe modificar exactamente tantos usos ... y si comienza a analizarlo comolong bien podría tener que cambiar adouble (aunque eso no tiene sentido para las identificaciones) ... y si no puede estar seguro de qué analizar elString dentro de ti no puede implementar nada.

Pregunta 2

Además de esta pregunta, tengo otra: me doy cuenta de que el artículo tiene más de siete años, así que ¿alguien podría señalarme algunas descripciones recientes sobre el diseño OO, y específicamente ideas sobre el debate de ocultación de getter / setter e implementación?

Listing 1. Empleado: el contexto del constructor
  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() );
      }

      //...
  }