Java: Почему размещение статических переменных имеет значение? - PullRequest
1 голос
/ 08 апреля 2019

В следующем примере определены 2 статические переменные.Переменная 1 (myBoolean1) определена над переменной MySingletonExample (instance).

Переменная 2 (myBoolean2) определяется ниже переменной MySingletonExample (instance).

Обе переменные установлены на true , но только 1 переменная (myBoolean1) показывает правильное значение при отображении.

public class MySingletonExample 
{

    //static volatile boolean  myBoolean1 = false;
    static boolean  myBoolean1 = false;

    private static volatile MySingletonExample instance = new MySingletonExample();

    //static volatile boolean  myBoolean2 = false;
    static boolean  myBoolean2 = false;


    private MySingletonExample()
    {
        myBoolean1 = true;
        myBoolean2 = true;
    }

    protected static MySingletonExample getInstance() 
    {
        System.out.println("myBoolean1 = " + myBoolean1);
        System.out.println("myBoolean2 = " + myBoolean2);
        return instance;
    }


    public static void main(String[] args)
    {
        MySingletonExample.getInstance();
        System.out.println("---------------------------");
        MySingletonExample.getInstance();
    }

}

При выполнении это вывод.

myBoolean1 = true

myBoolean2 = false

myBoolean1 = true

myBoolean2 = false

Почему myBoolean2 не возвращает вместо этого truefalse как myBoolean1?

Разница только в размещении.Есть ли «правило» при работе со статическими переменными?

Ответы [ 2 ]

10 голосов
/ 08 апреля 2019

myBoolean2 возвращается в false после установки в конструкторе значения true из-за порядка инициализации статической переменной.

Есть ли "правило" при работе со статическими переменными?

Да. Статический синглтон не нуждается в статическом состоянии. Просто сделайте их обычными полями.

private static volatile MySingletonExample instance = new MySingletonExample();

private final boolean myBoolean1;
private final boolean myBoolean2;

private MySingletonExample()
{
    myBoolean1 = true;
    myBoolean2 = true;
}

//...

Синглтон является антипаттерном, но если вы чувствуете, что должны его использовать, реализуйте его, используя перечисление .

5 голосов
/ 08 апреля 2019

Вся статика в блоке выполняется в порядке. Итак, сначала myBoolean1 устанавливается на false, затем идет вызов конструктора MySingletonExample(), который устанавливает myBoolean1 и myBoolean2 на true. Наконец, myBoolean2 устанавливается на false.

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

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