2011-08-24 16 views
22

¿Cuál es la diferencia entre definir e inicializar las variables miembro al principio de la definición de clase y definir primero las variables miembro e inicializar las variables miembro en el constructor?¿Inicializar las variables miembro al principio de la definición de la clase o en el constructor?

Digamos, por ejemplo:

public class Test { 
    private int foo = 123; 
    private boolean flag = false; 

    public void fooMethod() {...} 
} 

Versus:

public class Test { 
    private int foo; 
    private boolean flag; 

    public Test() { 
     foo = 123; 
     flag = false; 
    } 

    public void fooMethod() {...} 
} 

Gracias de antemano.

+1

posible duplicado de [Mejor práctica: Inicializar campos de clase en el constructor o en la declaración?] (Http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at -declaración) –

Respuesta

17

En su ejemplo, la única diferencia es cuando se inicializan. De acuerdo con el JLS, las variables de instancia se inicializan antes de llamar al constructor. Esto puede volverse interesante cuando tiene súper clases con las que lidiar, ya que el orden de inicialización no siempre es tan obvio. Con eso, tenga en cuenta que las variables de instancia "súper" aún se inicializarán cuando no se llame a un superconstructor explícito.

+0

+1 y me imagino introducir todo tipo de errores que son increíblemente difíciles de rastrear ... –

5

La diferencia es el orden en que se inicializan/configuran.

Las variables de miembros de su clase se declararán/establecerán antes de llamar a su constructor. Mi preferencia personal es establecerlos en el constructor.

0

Normalmente, un constructor aceptará argumentos y los asignará a los campos de la clase.

public Test(int foo, boolean flag) 
{ 
    this.foo = foo; 
    this.flag = flag; 
} 
+0

¿No estás seguro de lo que quieres decir? –

+0

@aib, es Java, no C++. – Triang3l

2

La inicialización de la clase le permite evitar escribir un constructor trivial.

Tiene que inicializar los miembros de la instancia que dependen de los parámetros del constructor dentro del constructor. Podría ser razonable, para facilitar la lectura, poner la inicialización de todos los demás miembros de la instancia dentro del mismo constructor.

De lo contrario, no hay diferencia.

Cuestiones relacionadas