Pongamos el ejemplo de que creamos una clase “Texto” y queremos admitir para su atributo “texto” los valores nulos como String vacíos, podríamos implementar ésta funcionalidad en el constructor, algo que quedaría así:
public Texto(String texto){
if(texto==null){texto="";}
this.texto=texto;
}
Es perfectamente funcional, pero para conseguir un código en el que cada componente haga lo que se espera de él, lo mejor sería delegar ésta comprobación a un método de factoría, un método estático que llame al constructor, estableciendo el constructor privado.
private Texto(String texto){this.texto=texto;}
public static Texto crearTexto(String texto){
if(texto==null){return "";}
return texto;
}
Con el código anterior nuestro constructor queda más limpio y hace solo lo que debería hacer.
En el caso de que nuestro sistema no aceptará los valores nulos como String vacíos, podíamos haber codificado que retorne una excepción en lugar de cambiar ese parámetro pasado a la función. Un constructor que retorna una excepción es algo que ningún programador espera cuando llama a un constructor, este es otro gran ejemplo de que la mejor implementación sería delegar este retorno de excepción en un método de factoría.
En IntelliJ, podemos hacemos un refactor automático de ésto con el comando “Replace constructor with factory method” del menú de refactorización.