2009-02-10 15 views
19

Estaba pensando en cuanto código debería ponerse en los constructores en Java? Es decir, muy a menudo haces métodos auxiliares, que invocas en un constructor, pero a veces hay algunos elementos de inicialización más largos, por ejemplo, para un programa, que lee desde un archivo, o interfaces de usuario, u otros programas, en los que te encuentras. Inicialice solo las variables de instancia, en las cuales el constructor puede ser más largo (si no usa métodos auxiliares). Tengo algo en mente que los constructores deberían ser cortos y concisos, ¿no es así? ¿Hay excepciones a esto?¿Cuánto código debería uno poner en un constructor?

+0

prueba este artículo, debería responder a tu pregunta: http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html – yegor256

Respuesta

10

Si sigue los principios SOLID, cada clase debe tener un motivo para cambiar (es decir, hacer una cosa). Por lo tanto, un constructor normalmente no leería un archivo, pero tendría una clase separada que construye los objetos del archivo.

+0

gracias, me acabas de ayudar a evitar romper ¡el SRP! –

2

Tan poco como sea necesario para completar la inicialización del objeto.

Si puede hablar de una parte (5 o más líneas es mi guía) de su constructor como un pedazo de lógica o un proceso específico, probablemente sea mejor dividirlo en un método separado para fines de claridad y organización.

Pero a cada uno lo suyo.

1

Constructores debe ser sólo el tiempo suficiente, pero ya no =)

Si está definiendo varios constructores sobrecargados, no duplicar el código; en su lugar, consolide la funcionalidad en uno de ellos para una mayor claridad y facilidad de mantenimiento.

+0

Oye, ¿es una buena práctica agregar accesorios en los constructores? –

1

Como dijo Knuth, "la optimización prematura es la raíz de todo mal".

¿Cuánto debe poner en el consructor? Todo lo que necesitas hacer Este es el enfoque "ansioso". Cuando, y solo cuando, el rendimiento se convierte en un problema, ¿considera optimizarlo (a los enfoques "perezosos" o "excesivamente ansiosos")?

+0

El rendimiento no suele ser el problema; mantenimiento es! No estoy seguro si evitar una optimización prematura significa evitar una optimización de mantenimiento prematura ... – skiphoppy

+0

Sí, no creo que este problema sea sobre el rendimiento ... se trata más bien de diseñar un código adecuado que sea fácil de entender y fácil de entender para otros. –

+0

Sí y la mejor manera de escribir un código que se pueda mantener es escribirlo directamente (es decir, con ganas). El almacenamiento en caché para el rendimiento tiende a complicar mucho el código, lo que es contraproducente si el rendimiento no es un problema. – cletus

4

Eche un vistazo a this SO question. Aunque el otro es para C++, los conceptos son muy similares.

1

Los constructores deben crear la instancia más mínima y genérica de su objeto. ¿Qué tan genérico? Elija los casos de prueba que cada instancia u objeto que hereda de la clase debe pasar para que sean válidos, incluso si "válido" solo significa que falla correctamente (excepción generada programáticamente).

Wikipedia tiene una buena descripción:

http://en.wikipedia.org/wiki/Constructor_(computer_science)

un objeto válido es el objetivo del constructor, no es válido necesariamente útil - que se puede hacer en un método de inicialización.

0

Mi práctica habitual es que si todo lo que el constructor tiene que hacer es establecer algunos campos en un objeto, puede ser arbitrariamente largo. Si se vuelve demasiado largo, significa que el diseño de la clase está roto de todos modos, o que los datos deben estar empaquetados en algunas estructuras más complejas.

Si, por otro lado, los datos de entrada necesitan un procesamiento más complejo antes de inicializar los campos de clase, tiendo a dar al constructor los datos procesados ​​y mover el procesamiento a un método de fábrica estático.

0

Es posible que deba inicializar su clase a un cierto estado, antes de poder realizar cualquier trabajo útil con ella.

Considere esto.

public class CustomerRecord 
{ 
    private Date dateOfBirth; 

    public CustomerRecord() 
    { 
     dateOfBirth = new Date(); 
    } 

    public int getYearOfBirth() 
    { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(dateOfBirth); 
     return calendar.get(Calendar.YEAR); 
    } 
} 

Ahora bien, si usted no inicializar el miembro de Varialble fechaDeNacimiento, cualquier invocación subsiguiente de getYearOfBirth(), dará lugar a una NullPointerException.

Así que la inicialización mínimo que puede implicar

  1. Asignación de valores.
  2. Invocando funciones auxiliares.

para garantizar que la clase se comporta correctamente cuando se invocan sus miembros más adelante, es todo lo que se necesita hacer.

0

Constructor es como un asistente de configuración de aplicaciones en el que hacer solamente configuración. Si la Instancia está lista para tomar cualquier (posible) Acción en sí misma, entonces Constructor está bien.

Cuestiones relacionadas