2017-10-18 4 views
3

Je suis encore en train d'apprendre à propos de l'encapsulation. J'ai un GrammarList, où chaque Grammar emcapsulated a un tableau listRule avec tous leurs setters & getters. comme on le voit ici:Pourquoi mon tableau est-il écrasé? Java

public class Grammar { 

private enum Type {Left, Right, NULL}; 
private String Nom; 
private static Type type = null; 
private static ArrayList<Rule> listRule; 

public Grammar(String nom, Type type) { 
    this.Nom = nom; 
    this.type = type; 
    this.listRule = new ArrayList<Rule>(); 
} 
... 
} 

Maintenant dans mon programme, je remarque que mon listRule tableau (où sont les règles associées à une grammaire sont ajoutées) est écrasé à chaque fois une nouvelle grammaire est ajoutée. J'ai été en mesure d'identifier que l'erreur se produit sur la ligne Grammar grammar = new Grammar(parametre[0], null); qui vide le contenu de listRule de toutes les autres grammaires afin que listRule semble être le même pour chaque grammaire. Est-ce que mon tableau listRule est mal créé ou est ma boucle?

try { 
     while ((strLine = br.readLine()) != null) { 
      String[] parametre = strLine.split(","); 
      Grammar G = GrammarList.containsNom(parametre[0]); 
      if (G == null) { 
       Grammar grammar = new Grammar(parametre[0], null); 
       grammarList.add(grammar); 
       for (int i = 1; i < parametre.length; i++) { 
        SyntaxCheck check = new SyntaxCheck(parametre[i]); 
        if (check.isValid()) 
         grammar.AddRule(check.Rule, check.Sens); 
       } 
      } 
     } 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
+0

Bienvenue sur Stack Overflow, pour mieux aider à diffuser plus tôt un [mcve] bon – Frakcool

Répondre

6

Votre champ listRule est static, ce qui signifie que chaque instance partage le même objet.

Retirez le static mot-clé:

private ArrayList<Rule> listRule; // not static