2010-12-07 9 views
5

Je viens de lire les conventions SUN java code; très beau document btw. Et je l'ai lujava beginner: initialisation des variables de classe

6,3 Initialisation: Essayez d'initialiser les variables locales où ils sont déclarés. La seule raison de ne pas initialiser une variable où elle est déclarée est si la valeur initiale dépend de l'exécution d'un calcul en premier.

Et je me demandais si Class variables ont de la même suggestion ou non, par exemple je:

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))); 
     } 
    } 
} 

RÉDACTION CODE # Si j'initialiser le variable où il est déclaré (en classe), je supprimer "ligne 2" et laissez "ligne 3" car la question de performance # réservation (lignes) en mémoire comme vous le savez.

La question est:

  1. fait qu'une bonne pratique ou l'initialisation appliquent la matière que pour les variables locales à l'intérieur des méthodes etc seulement?
  2. Si tout va bien, je veux savoir ce qui viendra en premier si j'ai fait le CODE D'EDITION # l'initialisation @ ligne 3 ou l'initialisation @ ligne 1?

Répondre

4

Ce sont instance variables, pas les variables de classe. Les variables d'instance appartiennent à un objet spécifique, les variables de classe ne le font pas (désolé de le faire).

Je pense que l'initialisation de la variable où elle est déclarée est plus simple et plus facile à lire. Le jvm commence à initialiser les variables d'instance et les blocs d'initialisation d'instance en haut du fichier et à descendre, seulement après avoir initialisé toutes les variables et exécuté les blocs d'initialisation, il exécute le constructeur.

+0

oui je suis d'accord avec vous maintenant après avoir eu un peu plus d'expérience –

1

La ligne que vous avez citée fait uniquement référence aux variables locales. Parce que dans Java les variables locales n'ont pas besoin d'être déclarées en haut de la portée mais peuvent être déclarées n'importe où avant d'être utilisées, cela a beaucoup de sens.

Pour les variables de classe et d'instance, ma préférence personnelle est d'initialiser la variable où elle est déclarée. Dans de nombreux cas où je n'ai pas d'autres constructeurs que la valeur par défaut, cela supprime le besoin d'écrire un constructeur par défaut car le compilateur en fournira automatiquement un. Je trouve cela nettoie et raccourcit mon code.

Dans le second cas, vous avez fourni un bon cas d'initialisation dans le constructeur. Avec les variables de classe j'ai trouvé peu de fois où je voudrais initialiser dans le bloc d'instanciation au lieu de inline à la déclaration

0

Vous avez quelques options différentes qui relèvent toutes probablement de micro-optimisations. En règle générale, ces types d'optimisations ne posent pas de problème à moins de travailler avec des variables statiques dans un environnement concurrent ou de faire quelque chose de génial comme le regroupement de classes.

  1. Il n'y a aucune raison pour laquelle vous ne pouvez pas initialiser vos variables dans votre constructeur ou d'autres méthodes similaires à ce qui est décrit here. Personnellement, je préfère initialiser mes variables à leur déclaration autant que possible. D'après ce que je comprends, l'initialisation se produira à peu près au même moment si elle se produit dans le constructeur par rapport à la déclaration. Je n'ai jamais eu besoin de savoir ce qui vient en premier en pratique, mais vous pourriez faire un simple test System.out pour le savoir.

1

Je voudrais argumenter pour laisser votre code tel qu'il est.

Alors qu'en général j'aime initialiser les variables d'instance à la déclaration, je n'aime pas le faire quand je dois les ré-initialiser dans un constructeur. Je préfère soit initialiser à la déclaration, ou dans chaque constructeur-chemin (peut-être juste dans un seul constructeur appelé par tous les autres constructeurs). La déclaration pure indique que quelque chose de plus compliqué se passe, alors que déplacer l'initialisation la plus simple vers la déclaration peut cacher cela.

Questions connexes