В Java могу ли я сохранять переменную от одного метода к следующему и между классами?

#java #variables #methods #persistent

#java #переменные #методы #постоянный

Вопрос:

В Java могу ли я сохранять переменную от одного метода к следующему и между классами?

Я пытаюсь получить переменную из команд, изменить ее в QandA и ожидать, что она сохранится, пока я не изменю ее снова.

     public class Commands
{
   int torch = 1;
}
_____________

public class QandA
{
     Dostuff d = new Dostuff
     Commands a = new Commands();
     public void torch
{
     System.out.println("Torch = "   torch);
     a.torch = 2;
     System.out.println("Torch = "   torch);
     d.dostuff();
}
public class dostuff
{
     public void dostuff()
   {
     // User imput is gathered here etc etc.
    QandA();
   }    
  

}

Итак, я ожидал бы, что вывод будет (цикл)

Torch = 1

Torch = 2

Torch = 2

Torch = 2

Torch = 2

Torch = 2

После 3 циклов. Но что это делает, так это.

Torch = 1

Torch = 2

Torch = 1

Torch = 2

Torch = 1

Torch = 2

После трех циклов.

Пожалуйста, помогите.

Комментарии:

1. Просто педантичный момент — поскольку другие умело описали вашу проблему. Люк, в общем, ты хочешь ИЗБЕГАТЬ открытых элементов, которые ты использовал, потому что становится очень сложно инкапсулировать их позже с помощью бизнес-логики (проверка и т.д.) И обеспечить потокобезопасность. Используйте методы получения / установки, если вы не уверены, что класс всегда будет таким примитивным, всегда используемым в одном потоке и не используемым слишком многими классами. Просто указатель.

Ответ №1:

С сохранением данных проблем нет, однако вы должны осознавать, где вы их создаете и сохраняете.

В вашем случае вы объявляете «torch» внутри области видимости командного класса, как член команды, инициализированный «1» (я думаю, синтаксис немного забавный). Поэтому каждый раз, когда вы объявляете «new Command ()», вы начинаете с новой переменной «torch» == 1.

Вы можете объявить «torch» как статический, что означает, что он является общим для всех экземпляров Command, и тогда он будет вести себя так, как вы хотите, поскольку он не будет сбрасываться при каждом вызове конструктора (при условии, что вы не устанавливаете для него значение 1 внутри конструктора).

Комментарии:

1. Это была ошибка при переводе моего кода из большого беспорядка прямо в точку. 🙂

2. Спасибо за вашу помощь! Я работал над этим часами. 😀

Ответ №2:

Я не уверен, как вы ссылаетесь на класс, подобный dostuff(); и QandA(); [для них должны быть ошибки компиляции], но просто имейте в виду создать только один экземпляр Command и передавать один и тот же экземпляр повсюду. В вашем случае каждый раз, когда вы создаете экземпляр QandA, создается Command экземпляр с его torch полем, равным 1