Java передает переменные из метода в одном классе в другой класс - PullRequest
1 голос
/ 29 января 2012

У меня есть эта переменная int внутри класса StringSplit, значение которой мне нужно передать другому классу с именем EndStatement для распечатки;Я не могу передать это как параметр, хотя я думаю.Как мне лучше всего получить переменную туда, где она мне нужна?Может кто-нибудь помочь с подсказкой?Я читал учебники по Java, но не совсем понял.Переменные и их передача кажутся одной из моих ахиллесовых пят в программировании на Java.

РЕДАКТИРОВАТЬ В ДОБАВИТЬ: parseCommands может вызывать несколько различных классов операторов, например EndStatement или PrintlnStatement, в зависимости от первого элемента проанализированного массиваиз строки, которая служит ключевым словом для HashMap с именем commandHash.Классы Statement реализуют интерфейс Directive, который имеет только метод с именем execute с параметром String[] parts.(EndStatement implements Directive).Расширен метод parseCommands, чтобы показать, что происходит.

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

}

Ответы [ 3 ]

3 голосов
/ 29 января 2012

Я впервые отвечаю на вопрос, но думаю, что прав.

В StringSplit вы хотите объявить linceCounter в поле данных.

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
}

Затем в вашем главном вызове метода getLinceCounter, затем передайте то, что он возвращает EndStatment.

Имеет ли это смысл?Я правильно понял ваш вопрос?

1 голос
/ 29 января 2012

Я думаю, вы смешали несколько терминов.Нет такой вещи, как передача переменных из одного класса в другой.Я предполагаю, что вы просто хотите получить доступ (установить / получить) вашу переменную вне класса StringSplit.Для этого вы должны объявить lineCounter вне метода parseCommands как свойство StringSplit.В настоящее время lineCounter является локальным для метода parseCommands и поэтому не может быть виден / доступен вне этого метода, не говоря уже о возможности доступа к нему извне класса / объекта.Сделайте это:

public class StringSplit
{

    public int lineCounter = 0;
    ...

Теперь вы сможете получить доступ к lineCounter из разных методов одного и того же класса и из методов вне вашего класса.Обнародование lineCounter дает другим полный доступ к нему.Как указал «Джон», иногда это может быть опасно, но для данного примера это приемлемо.Вы можете увидеть, как можно запретить запись извне, используя личное поле 'Nurlan's' с участником, который используется только для доступа для чтения.

1 голос
/ 29 января 2012
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]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...