2010-09-17 20 views
8

Estoy un poco avergonzado de preguntar que, siendo un programador de Java durante años, pero aquí va:
¿Hay alguna diferencia entre asignar objetos durante la construcción, y hacerlo directamente al declarar el campo relevante? Es decir, hay una diferencia entre los dos siguientes:inicialización de miembro de la clase java

public class MyClass{ 
    MyObj obj=new MyObj(); 
} 

Y

public class MyClass{ 
    MyObj obj; 
    public MyClass() { 
     obj=new MyObj(); 
    } 
} 

Por supuesto, yo supongo que esto init específicas de no dependen de parámetros externos. variables

+2

No hay nada de que avergonzarse. ¡Todos aprenden aquí! – bdhar

Respuesta

3

inicialización de instancia hecho antes llamada al constructor

Su no es bueno para hacerlo.
Puede restringir al usuario de call of const. si desea realizar cierta operación antes de la inicialización.

Mejor Práctica:

  1. no inicializan con los valores por defecto en la declaración (nulo, falso, 0, 0,0 ...).
  2. Prefiere la inicialización en la declaración si no tiene un parámetro de constructor que cambie el valor del campo.
  3. Si el valor del campo cambia debido a un parámetro constructor ponga la> inicialización en los constructores.
  4. Sea constante en su práctica. (La regla más importante)

de here

+0

También con llamadas de variables/métodos estáticos puede generar una NullPointerException si la variable no se inicializa hasta el constructor. – Sean

+1

No estoy de acuerdo con que * cualquiera * de esas reglas sea la "mejor práctica". Ninguno de ellos afecta significativamente la legibilidad del código, y eso es lo único que realmente importa aquí. –

+0

La lectura del código no es solo una preocupación, creo, siento que es lo mejor para mí al menos. y, por supuesto, cualquiera de los programadores de Java irá por const. primero en leer el código –

2

No, no lo hay. Excepto que si agrega varios constructores tendrá código duplicado.

Una alternativa es el uso de un bloque de inicialización

{ 
    var = 1; 
} 

Referencia: Initializing Fields

Cuestiones relacionadas