это действительный синглтон, игнорирующий многопоточность - PullRequest
0 голосов
/ 03 июля 2019
import java.util.*;
import java.lang.*;
import java.io.*;

class Logger {
    private static final Logger logger = new Logger();
    private static final String test = "value";
    private Logger() {
        System.out.println("Called Constructor!");
    }
    public static Logger getLogger() {
        return logger;
    }
}

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Logger logger;
        Logger logger2 = Logger.getLogger();
    }
}

В дополнение к пониманию того, является ли приведенный выше код одноэлементным или нет, у меня есть еще несколько сомнений.

Q1) Когда я создал переменную logger, почему не вызывается приватный конструктор, а когда я вызывал функцию getLogger(), почему вызывается приватный конструктор?

Q2) когда присваивается значение переменной test? до или после вызова частного конструктора?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Да, это правильный синглтон, и он потокобезопасен.

Когда я создал регистратор переменных, почему закрытый конструктор не вызывается, а когда я вызывал функцию getLogger (), почему вызывается закрытый конструктор?

Потому что объявление переменной не делает ничего, кроме объявления переменной. Он не вызывает никаких методов и не создает никаких объектов.

когда назначается значение тестовой переменной? до или после вызова частного конструктора?

В то же время, когда класс инициализируется.

0 голосов
/ 03 июля 2019

Это правильный синглтон:

Когда я создал регистратор переменных, почему закрытый конструктор не вызывается, а когда я вызывал функцию getLogger (), почему вызывается закрытый конструктор?

Soo .. Когда вы объявляете переменную, вы резервируете пространство памяти, вы не инициализируете ее с помощью вашего регистратора, когда объявление экземпляра Logger статически внутри вашего класса регистратора java инициализирует его на ходу, затем, когда вы вызовите getLogger, вы просто даете указатель на этот экземпляр Logger.

когда назначается значение тестовой переменной? до или после вызова частного конструктора?

Сразу после вызова вашего конструктора.

...