2012-01-29 4 views
1

J'ai cette variable int dans la classe StringSplit dont la valeur je dois passer à une autre classe appelée EndStatement à imprimer; Je ne peux pas vraiment le passer en paramètre si je pense. Comment puis-je obtenir la meilleure variable là où j'en ai besoin? Quelqu'un peut-il aider avec un indice? J'ai lu les tutoriels Java mais je ne les ai pas vraiment compris. Les variables et leur transmission semblent être l'un de mes talons d'Achille dans la programmation Java.Java passant des variables de la méthode dans une classe dans une classe différente

EDITER POUR AJOUTER: parseCommands peut appeler plusieurs classes d'instructions différentes, par ex. EndStatement ou PrintlnStatement en fonction du premier élément d'un tableau analysé à partir d'une chaîne qui sert de mot-clé à une HashMap appelée commandHash. Les classes Statement implémentent l'interface de la directive qui n'a qu'une méthode appelée execute avec le paramètre String[] parts. (EndStatement implements Directive). Élargissement de la méthode parseCommands pour montrer ce qui se passe.

public class StringSplit 
{ 
    public void parseCommands(String fileName) 
    { 
     //FileReader and BufferedReader to read a file with the code 
     //to execute line by line into an ArrayList myString 

     int lineCounter=0; //need to get this variable's value into class EndStatement 

     for (String listString: myString) 
     { 
     lineCounter++; 
     String[] parts=listString.trim.split("[\\s]+", 2)//split String into 2 parts 
                 //to get commands 
     Directive directive= commandHash.get(parts[0])//parts[0] is the hashmap keyword 
    } 

public class EndStatement implements Directive 

{ 
    public void execute(String[] parts) 
    { 
     //need to get lineCounter here--how? 
     System.out.print(lineCounter +"lines processed."); 
    } 


    public static void main (String[]args) 
    StringSplit ss = new StringSplit(); 
    ss.parseCommands(args[0]); 

} 
+1

Il n'est pas clair du tout ce que vous voulez réaliser. Qui/que voulez-vous passer 'lineCounter', et où? – Mat

+1

Vous n'appelez jamais 'EndStatement.execute' - ce qui rend très difficile de dire ce que vous essayez de faire. * Pourquoi * ne pouvez-vous pas utiliser un paramètre? –

+0

@Jon Skeet parce que je surcharge l'interface de la directive, qui n'a pas la variable 'lineCounter' en paramètre. La classe 'EndStatement' est l'une des nombreuses classes qui pourraient être appelées par la méthode' parseCommands'. @Mat J'essaie de rendre 'lineCounter' accessible aux classes en dehors de la classe' StringSplit' dans laquelle il est, comme la classe 'EndStatement' ci-dessus. Désolé pour la confusion. – Luinithil

Répondre

1
public class StringSplit 
{ 
    private int lineCounter=0; 

    public void parseCommands(String fileName) 
    { 

     for (String listString: myString) 
     { 
      lineCounter++; 
      //more code here 
     } 
    } 

    public int getLineCounter() { 
     return lineCounter; 
    } 
} 

public class EndStatement implements Directive 
{ 
    StringSplit ss = new StringSplit(); 

    public void execute(String[] parts) 
    { 
     //need to get lineCounter here--how? 
     System.out.print(ss.getLineCounter() +"lines processed."); 
    } 


    public static void main (String[]args) 
    { 
     ss.parseCommands(args[0]); 
    } 
} 
+1

Pas même un indice sur la façon de rendre les champs publics est une mauvaise idée? –

+0

Oui, en fait j'utilise 'private' – Nurlan

+0

Pas dans le code que vous avez posté vous n'êtes pas. Donc, vous encouragez un débutant à utiliser de mauvaises habitudes (champs publics) au lieu de montrer comment cela devrait être fait. –

3

C'est ma première fois de répondre à une question, mais je pense que je ne me trompe pas.

Dans StringSplit, vous souhaitez déclarer linceCounter dans un champ de données.

public class StringSplit 
{ 
    public void parseCommands(String fileName) 
    { 
     lineCounter=0; //this is the variable I need to pass into a different class 
     for (String listString: myString) 
     { 
     lineCounter++; 
     //more code here 
     } 
    } 

    public int getLineCounter() 
    { 
      return lineCounter; 
    } 


    private int lineCounter; //this is what I call a data field, you should declare these as private as oppose to public to comply with encapsulation 
} 

Ensuite, dans votre principal appel de méthode getLinceCounter, passe ensuite ce qu'il retourne à EndStatment.

Est-ce que cela a du sens? Ai-je bien compris votre question?

1

Je pense que vous mélangez certains termes. Il n'y a pas de passage de variables d'une classe à une autre. Je suppose que ce que vous voulez faire est simplement de pouvoir accéder (définir/obtenir) votre variable en dehors de la classe StringSplit. Pour ce faire, vous devez déclarer lineCounter en dehors de la méthode parseCommands en tant que propriété de StringSplit. Actuellement, lineCounter est local à la méthode parseCommands et en tant que tel ne peut pas être visible/accédé en dehors de cette méthode sans mentionner d'être capable d'y accéder depuis l'extérieur d'une classe/objet. Faire:

public class StringSplit 
{ 

    public int lineCounter = 0; 
    ... 

Maintenant, vous serez en mesure d'accéder LineCounter de différentes méthodes de la même classe et de méthodes en dehors de votre classe. Rendre lineCounter public donne aux autres un accès complet. Comme Jon l'a souligné, cela peut parfois être dangereux, mais pour cet exemple, le cas est acceptable. Vous pouvez voir comment l'écriture de l'extérieur peut être évitée en utilisant le champ privé 'Nurlan' avec un membre utilisé pour fournir uniquement l'accès en lecture.

Questions connexes