2010-12-10 26 views
7

¿Es una buena práctica inicializar variables, especialmente referencias de objeto en el nivel de clase? Considere los siguientes ejemplos;¿Deberían los miembros inicializarse en la clase o el constructor?

public class MyClass { 

    private static MyObject myObject; 

    public static void main(String[] args) { 

     myObject = new MyObject(); 
    } 
} 

o

public class MyClass { 

    private MyObject myObject = new MyObject(); 

    public static void main(String[] args) { 

      // Other code 
    } 
} 

¿Qué camino es el mejor? Por favor, guíame sobre los pros y los contras de ambos.

Atentamente.

+2

Bueno, ya que el primero no se compilará ... –

+0

@Jonathon: Olvídate de la estática por un momento. Solo quiero saber la mejor manera. – Chromium

+1

Tenga en cuenta que está dejando fuera los bloques de inicialización estáticos, los bloques de inicialización normales, los constructores, la reflexión y, probablemente, una serie de otras opciones. Los constructores antiguos y simples son probablemente perfectamente adecuados la mayor parte del tiempo, por lo que ninguna de sus opciones es "lo mejor". No hay tal cosa como "lo mejor". –

Respuesta

6

En general, se prefiere la instanciación diferida (el primer fragmento) ya que el objeto tiene una vida útil (potencialmente) más corta. Debes favorecer el tiempo de vida del objeto más corto posible.

+0

Gracias por la respuesta rápida. – Chromium

+0

+1 para "Debería favorecer el tiempo de vida del objeto más corto posible". – Chromium

+0

Actualicé mi pregunta. – Chromium

1

Depende del alcance que desee que tenga cada campo y la huella de memoria que desee que tenga su método. Cuando declara un campo en el nivel de Clase, el área de memoria se inicializa para sus campos en tiempo de ejecución. Cuando los declaras a nivel de método, la memoria que se necesita e inicializa para esos campos en el momento de la ejecución, y luego cuando el método finaliza, la memoria se marca para la recolección de elementos no utilizados. A nivel del método existe la posibilidad de que la huella de memoria de su clase se reduzca y crezca según sea necesario. Si nunca se llama al método, ¿realmente necesita que esos campos estén siempre disponibles?

He encontrado que los campos de nivel de clase son buenos para cualquier cosa que quieras que sea static final, o sin cambios e inalterables. No necesariamente una variable global por así decirlo, pero muy cerca de ella. A menos que, por supuesto, esté creando una clase que sea un objeto de transferencia de datos, entonces todo lo que quiera que sea visible, o debe inicializarse, sería a nivel de Clase. Los campos de nivel de método son buenos para algo que necesita temporalmente para realizar un cálculo.

+1

Gracias señor por la explicación. – Chromium

3

En mi experiencia personal, se trata de qué tan caro o detallado es la creación de objetos. En segundo lugar, también puede considerarlo como creación perezosa frente a creación activa. Normalmente creo objetos a nivel de variable de instancia si solo está involucrado el constructor. Si hay más llamadas para inicializar al miembro en cuestión, definitivamente la llamada se moverá al constructor o a un método donde se debe inicializar.

Es por eso que se utiliza el patrón de método de fábrica, para delegar la creación del objeto real a otra clase.

+0

Gracias por la explicación. – Chromium

1

Tenga en cuenta que todo se inicializa en java aunque los objetos se inicializan en nulo.

Por lo general, desea fallar anticipadamente (excepciones de puntero nulo) por lo que no desea inicializar a un valor arbitrario/compuesto, por lo que diría que en la mayoría de los casos no se inicializa a menos que sepa cuál debe ser el valor el tiempo de creación de las clases externas.

1

A menos que sea un singleton, no tiene sentido inicializar. Probablemente desee una nueva instancia con un constructor o instalador.

1

también se puede tratar con esto ....

public class MiClase {

private static MyObject myObject; 

public static void main(String[] args) { 

    if(myObject == null) 
    { 
     myObject = new MyObject();   //this will check ..... IMP 
    } 
} 

}

Cuestiones relacionadas