JavaWorld no OO: Getters / Setters vs Builder

Fundo

Eu encontreiEste artig no JavaWorld, onde Allen Holub explica uma alternativa aos Getters / Setters que mantém o princípio de que a implementação de um objeto deve ser oculta (seu código de exemplo também pode ser encontrado abaixo

É explicado que as classesName/EmployeeId/Money deve ter um construtor usando uma única string - o raciocínio é que, se você digitar comoint e, posteriormente, é necessário alterá-lo paralong, você terá que modificar todos os usos da classe e, com esse padrão, não precisar

Questão 1

Eu estava pensando: isso simplesmente não move o problema para a análise doString parâmetros sendo lançados? Por exemplo, se todo o código usando oEmployeeId (recebido doExporter) analisa oString em umint e de repente você começa a exportarlong, você precisa modificar exatamente quantos usos ... e se você começar a analisá-lo comolong pode ter que mudar paradouble (mesmo que isso não faça sentido para os IDs) ... e se você não tiver certeza do que analisar oString Na sua não pode implementar nada.

Questão 2

Além desta pergunta, eu tenho outra: eu sei que o artigo tem mais de sete anos, então alguém poderia me indicar algumas visões gerais recentes sobre o design de OO e, especificamente, idéias sobre o debate oculto de getter / setter e implementação?

Listagem 1. Empregado: o contexto do construtor
  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() );
      }

      //...
  }

questionAnswers(4)

yourAnswerToTheQuestion