У меня есть класс контроллера, который имеет как статические, так и нестатические переменные и методы.
public class Controller
{
// Model that will be used throughout the program
private static Model model;
private static ArrayList<Model> modelList = new ArrayList<Model>();
// User Views
private static OpenProgramView initialView = new OpenProgramView();
private DriverProfileView driverProfileView;
}
Существует также статический метод, который мне нужен, чтобы другие классы могли получить к нему доступ без экземпляра контроллера. Ниже приведен вызов этого метода:
int askYear = Controller.getModel().getYear();
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я использую предыдущую строку кода, она, похоже, вызывает новый экземпляр частного статического объекта - OpenProgramView. Я знаю это, потому что он всплывает во время тестирования, когда он не должен. Я также изменил другие представления от нестатического к статическому, чтобы увидеть, что произойдет, и они также появятся, когда я использую статический метод, но нестатические представления не появлялись.
Мой вопрос - почему это происходит? Похоже, что когда я вызываю статический метод, он создает новый экземпляр всех переменных статического класса в контроллере и создает проблему.
Редактировать:
Я не указывал, что это происходит только тогда, когда я тестирую этот фрагмент кода. Когда эта проблема возникла, я еще не создал объект Controller, поэтому в первый раз, когда я касаюсь класса Controller, вы вызываете статический метод.
Когда я запускаю программу из тестового режима и фактически использую ее для функциональных целей - объект-контроллер уже создан при создании программы, поэтому эта проблема не возникает, когда я вызываю статический метод, потому что это не " В первый раз я "коснулся" класса. Спасибо за помощь.
Это потому, что в первый раз, когда вы коснетесь класса (вызов метода, обращение к полю или создание объекта), все статические поля будут инициализированы.
Это гарантируется спецификацией Java Language Specification, и вы не можете этого сделать.
getModel
который вы не показываете, таким образом создавая проблему.