Siempre he sentido que, en general, el trabajo principal de una clase debe hacerse en sus métodos de instancia, mientras que el constructor solo debe obtener la instancia en un estado inicial utilizable.¿Algún problema con hacer el trabajo principal de una clase en su constructor?
Pero me parece que en la práctica hay situaciones en las que parece tener más sentido colocar esencialmente todo el trabajo real en el constructor.
Un ejemplo: necesito recuperar información específica de DBMS de la base de datos. La forma más natural para mí parecía tener un DBMSSpecInfo clase, con un constructor:
public DBMSSpecInfo(java.sql.Connection conn) throws SQLException{
// ... retrieve info from DBMS
}
/** @returns max size of table in kiB */
public int getMaxTableSize() {//...}
/** @returns max size of index in kiB */
public int getMaxIndexSize() {//...}
/** @returns name of default schema */
public String getDefaultSchema() {//...}
Se podría construir la clase una vez, el constructor se vendería todos los datos, entonces se podría utilizar diversos métodos get para recuperar la información que necesita .
Por supuesto que podría poner el método en otro lugar, y solo usar DBMSSpecInfo
para el valor de retorno (esencialmente usando DBMSSpecInfo solo como portador del valor), pero se siente feo crear una clase solo para devolver valores desde una sola función.
¿Qué opinas? ¿Hay problemas con la realización del trabajo principal en el constructor? ¿Es "no idiomático" en Java? ¿O es una práctica aceptable (aunque posiblemente poco común)?
+1 De hecho, esto es exactamente lo que hice. Acabo de hacer público el constructor de DBMSSpecInfo, pero como es solo un valor containert (solo 'public''fans' fields + constructor) no hay daño en que otros construyan instancias. Además, un constructor público ayuda si necesita instancias con valores predeterminados para probar otras unidades de otros métodos. – sleske
Este es el compromiso más razonable: no destruye la encapsulación, pero aún permite pruebas de unidades relativamente sencillas. Pero todavía creo que las cosas deberían ser burladas. –
Sí, como mencionas si necesitas instancias con valores predeterminados para pruebas unitarias, está bien tener un constructor público. Pero esto también tiene que ver con la funcionalidad que desea aplicar. Hay muchos casos en los que desea asegurarse de que se haya creado una determinada instancia de objeto con toda la información correcta. Piense, por ejemplo, DataRow. En ese caso, recomendaría encarecidamente constructores privados o internos. – Dummy01