Не удается получить доступ к переменным с помощью getter

#java #setter #getter

#java #сеттер #getter

Вопрос:

Итак, эй, ребята, у меня возникли некоторые проблемы со сценарием, который я пишу (с пользовательским api и прочим), поэтому у меня есть основной класс, в котором я использую данные из своего графического интерфейса для редактирования переменных в моем классе ScriptVariables, например:

 GUI g = new GUI();     
ScriptVariables sv = new ScriptVariables();   
String foodNameString = g.textField.getText();
sv.setFoodName(foodNameString);

String amountString = g.textField_1.getText();
int amountInt = Integer.parseInt(amountString);
sv.setAmount(amountInt);

double healthPercentageValue = g.slider.getValue();
sv.setHealthPercentage(healthPercentageValue);
 

(Ps: я зарегистрировал это с помощью getter, и этот бит работает нормально)
Теперь в другом классе я пытаюсь получить к нему доступ ПОСЛЕ выполнения предыдущего кода, я делаю это так:

 ScriptVariables sv = new ScriptVariables();

String foodName2 = sv.getFoodName();
int amount2 = sv.getAmount(); 
 

Теперь проблема в том, что когда я регистрирую эти переменные, я получаю null для строки и 0 для int.

Есть идеи?

Ответ №1:

Вы обращаетесь к двум разным экземплярам ScriptVariables , поэтому они не совместно используют переменные экземпляра. Тот факт, что вы установили свойства text и foodName для первого экземпляра, не влияет на новый экземпляр, который вы создаете в своем другом классе.

Что вы можете сделать, это либо создать свойства text and foodName static , либо передать ссылку на первый ScriptVariables экземпляр во второй фрагмент кода.

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

1. Хорошо, как мне передать ссылку из первого экземпляра во второй?

2. Распространенный способ — передать его через конструктор при создании экземпляра второго класса.

Ответ №2:

ScriptVariables sv = new ScriptVariables(); создает экземпляр, отличный от того, для которого вы ранее установили его поля ( foodName и amount ). В этом новом экземпляре foodName amount поля and все еще не инициализированы, следовательно, значения null и zero .

Предполагая, что ваш второй класс ScriptVariablesAccessor , тогда вы можете включить поле типа ScriptVariables в его определение класса. Затем это поле будет использоваться для передачи ранее заполненного экземпляра с помощью конструктора или метода setter.

 public class ScriptVariablesAccessor {
   private ScriptVariables sv;

   public ScriptVariablesAccessor(ScriptVariables sv) {
      this.sv = sv;
   }

   // or use a setter
   public void setScriptVariables(ScriptVariables sv) {
      this.sv = sv;
   }

   public void processVariables() {
      String foodName = sv.getFoodName();
      int amount = sv.getAmount();
      // do something with foodName and amount;
   }
}
 

Ниже показано, как вы могли бы вызвать этот класс с помощью подготовленного ScriptVariables :

 ScriptVariablesAccessor svAccessor = new ScriptVariablesAccessor(sv);
svAccessor.processVariables();
 

Ответ №3:

Вы создали два разных ScriptVariables объекта.

foodNameString и amountString могут быть созданы в static , и поскольку вы получаете их из другого класса, вы можете установить для них значение public или protected , но не private , затем вызвать ClassName.amountString , чтобы получить значение.

Или вы можете применить Singleton шаблон.

Или просто передайте ScriptVariables объект или эти строки в метод другого класса.