Синглтон шаблон выполнения заказа проблема - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь изучить шаблон одноэлементного проектирования. Код выглядит следующим образом:

public class Model {

    private static final Model INSTANCE = new Model();

    public static void main(String[] args) {
        Model.getInstance();
    }

    private Model(){
        System.out.println("constructor");
    }

    public static Model getInstance(){

        System.out.println("I hope to be printed first!");
        return INSTANCE;
   }
}

Я ожидаю, что сначала код напечатает I hope to be printed first!, а затем go через конструктор класса. но вывод кода обратный:

constructor
I hope to be printed first!

Не могу понять, почему сначала создается экземпляр класса?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Stati c переменные инициализируются при загрузке класса. Они инициализируются перед созданием любого объекта этого класса. Поскольку переменные stati c инициализируются до того, как выполняется любой метод класса stati c класса, вы получите ожидаемый результат. Проверьте https://beginnersbook.com/2013/05/static-variable/ и https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html для получения дополнительной информации и некоторых примеров.

0 голосов
/ 27 января 2020

Еще до выполнения main() метода JVM classloader загружает класс в память. В это время он инициализирует все переменные stati c и выполняет блоки инициализации stati c в порядке их появления в классе (сверху вниз).

Так как ваша переменная INSTANCE является stati c оно должно быть инициализировано. Таким образом, конструктор вызывается для создания экземпляра класса Model, который затем присваивается переменной INSTANCE. Поскольку это единственная переменная stati c и нет блоков stati c init, то выполняется main метод, который вызывает Model.getInstance().

При написании кода, который инициализирует различные типы полей, конечно, мы должны следить за порядком инициализации.

В Java порядок для операторов инициализации следующий:

stati c переменные и stati c инициализаторы в порядке

переменные экземпляра и инициализаторы экземпляра в порядке

конструкторы

https://www.baeldung.com/java-initialization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...