#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
объект или эти строки в метод другого класса.