Переменные статического класса создаются при вызове статических методов - Java

1

У меня есть класс контроллера, который имеет как статические, так и нестатические переменные и методы.

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, вы вызываете статический метод.

Когда я запускаю программу из тестового режима и фактически использую ее для функциональных целей - объект-контроллер уже создан при создании программы, поэтому эта проблема не возникает, когда я вызываю статический метод, потому что это не " В первый раз я "коснулся" класса. Спасибо за помощь.

  • 1
    Читайте о статической инициализации в классах Java
  • 1
    Эта проблема не должна появляться. Возможно, вы делаете что-то еще в статическом методе getModel который вы не показываете, таким образом создавая проблему.
Показать ещё 1 комментарий
Теги:
model-view-controller
static
controller

1 ответ

4
Лучший ответ

Это потому, что в первый раз, когда вы коснетесь класса (вызов метода, обращение к полю или создание объекта), все статические поля будут инициализированы.

Это гарантируется спецификацией Java Language Specification, и вы не можете этого сделать.

  • либо изменить модификатор на нестатический, либо
  • лениво инициализировать свои взгляды
  • 0
    Да, хорошая теория, но проблема ОП в другом: кажется, что когда я вызываю статический метод, он создает новый экземпляр всех статических переменных класса
  • 1
    @LuiggiMendoza: внимательно прочитайте ответ, он прав. Статические переменные связаны с самим экземпляром .class. Когда класс сначала загружается загрузчиком классов, все статические поля будут инициализированы. Это одна из причин, по которой вы никогда не должны полагаться на статику, чтобы связать свои вещи - порядок инициализации может очень сильно испортить ситуацию. Вместо этого используйте инфраструктуру внедрения зависимостей, такую как Guice или Spring.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню