2010-12-07 17 views
5

Acabo de leer el CONVENCIONES DE CÓDIGO Java SUN; muy buen documento por cierto. Y he leído estaprincipiante de java: variables de clase de inicialización

6,3 inicialización: Trate de inicializar las variables locales donde están declaradas. La única razón para no inicializar una variable donde se declara es si el valor inicial depende de algún cálculo que se produzca primero.

Y me preguntaba si Class variables están teniendo misma sugerencia o no, por ejemplo tengo:

public class NNmatrix { 

    protected ArrayList<ArrayList<Double>> matrix;  // line 1 
    public NNmatrix() { 
     matrix = new ArrayList<ArrayList<Double>>();  // line 2 
    } 
    /** 
    * 
    * @param otherMtrx 
    */ 
    public NNmatrix(final ArrayList<ArrayList<Double>> otherMtrx) { 
     final int rows = otherMtrx.size(); 
     matrix = new ArrayList<ArrayList<Double>>(rows); // line3 
     for (int i = 0; i < rows; i++) { 
      this.matrix.add(new ArrayList<Double>(otherMtrx.get(i))); 
     } 
    } 
} 

edición de código # Si yo hubiera inicializar el variable donde se declaró (en clase), lo haría eliminar "línea 2" y dejar "línea 3" porque el problema de rendimiento # reserva (filas) en la memoria como usted sabe.

La pregunta es:

  1. está haciendo que una buena práctica o inicialización cuestión sólo se aplican para las variables locales dentro de los métodos etc solamente?
  2. Si está bien, quiero saber qué vendrá primero si hice el CÓDIGO DE EDICIÓN # la inicialización @ línea 3 o la inicialización @ línea 1?

Respuesta

4

Estas son instancia variables, no variables de clase. Las variables de instancia pertenecen a un objeto específico, las variables de clase no (lo siento por nitpick).

Creo que la inicialización de la variable donde se declara es más simple y fácil de leer.

La jvm comienza a inicializar las variables de instancia y los bloques de inicialización de instancia en la parte superior del archivo y va hacia abajo, solo después de haber inicializado todas las variables y ejecutar los bloques de inicializador ejecuta el constructor.

+0

sí Estoy de acuerdo contigo ahora que tuve más experiencia –

1

La línea que cita se refiere solo a las variables locales. Debido a que en Java las variables locales no necesitan declararse en la parte superior del alcance, pero pueden declararse en cualquier lugar antes de que se utilicen, tiene mucho sentido.

Para las variables de clase y de instancia, mi preferencia personal es inicializar la variable donde se declara. En muchos casos en los que no tengo ningún otro constructor aparte del predeterminado, esto elimina la necesidad de tener un constructor predeterminado escrito ya que el compilador proporcionará uno automáticamente. Encuentro que esto limpia y acorta mi código.

En el segundo constructor de caso que proporcionó puede hacer una buena idea para inicializar en el constructor.

Con las variables de clase he encontrado algunas veces en las que me gustaría inicializar en el bloque de creación de instancias en lugar de en línea en la declaración.

0

Tiene un par de opciones diferentes que probablemente caigan bajo micro-optimizaciones. Normalmente, estos tipos de optimizaciones son de poca importancia a menos que esté trabajando con variables estáticas en un entorno concurrente o haciendo algo funky como agrupar clases.

  1. No hay ninguna razón por la que no puede inicializar las variables en su constructor u otros métodos similares a lo que se indica here. Personalmente, prefiero inicializar mis variables en su declaración siempre que sea posible.

  2. Según entiendo, la inicialización se producirá más o menos al mismo tiempo si se produce en la declaración de constructor vs. Nunca tuve que saber qué es lo primero en la práctica, pero podrías hacer una prueba simple de System.out para averiguarlo.

1

Yo discutiría por dejar su código como está.

Si bien, en general, me gusta inicializar las variables de instancia en la declaración, no me gusta hacerlo cuando tengo que volver a inicializarlas en algún constructor. Prefiero inicializar en la declaración, o en cada ruta de constructor (quizás solo en un único constructor llamado por cualquier otro constructor). La declaración pura indica que algo más complicado está sucediendo, mientras que mover la inicialización más simple a la declaración puede ocultar eso.

Cuestiones relacionadas