Чувствителен ли порядок статических элементов в Swing? - PullRequest
2 голосов
/ 27 мая 2011

У меня есть этот класс, скажем, Foo. Это extends JFrame и является синглтоном. При этом он имеет два статических поля : 1) экземпляр Foo и 2) Color.

Вот фрагмент кода Foo:

public class Foo extends JFrame{
    private static final Color FOO_RED = new Color(155, 64, 69);
    private static final Foo INSTANCE = new Foo();

    private Foo(){
        //do stuff
    }

    public static Foo getInstance(){
        return INSTANCE;
    }
}

У меня также есть другой класс, скажем, Launcher. Это основной класс , который отвечает за запуск приложения. Это простой класс в том смысле, что его единственная задача - делегировать задачу построения Foo для EDT.

Вот фрагмент кода Launcher:

public class Launcher{
    public static void main(String[] args){
        SwingUtilities.invokeLater((new Runnable(){
            @Override
            public void run()
            {
                Foo.getInstance();
            }
        }));
    }
}

Теперь все это работает просто отлично. Но , когда я переключаю порядок полей Foo ( См. Ниже ), компоненты, использующие FOO_RED, больше не окрашиваются в этот цвет.

public class Foo extends JFrame{
    private static final Foo INSTANCE = new Foo(); //declared before Color
    private static final Color FOO_RED = new Color(155, 64, 69);

    private Foo(){
        //do stuff
    }

    public static Foo getInstance(){
        return INSTANCE;
    }
}

Итак, возникает вопрос: имеет ли значение порядок статических полей , когда дело доходит до Swing?

Ответы [ 3 ]

5 голосов
/ 27 мая 2011

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

Я бы внес еще одно изменение в этот пример.Это сделает порядок статических полей менее важным.

ОБНОВЛЕНИЕ: используйте шаблон IDOH (Инициализация по требованию) , чтобы обеспечить безопасность одиночного потока.

private static class FooHolder {
    private static final Foo INSTANCE = new Foo();
}

public static Foo getInstance(){
    return FooHolder.INSTANCE;
}
4 голосов
/ 27 мая 2011

Да. порядок имеет значение для любых static полей / блоков.


EDIT : Сначала статическим полям присваивается значение по умолчанию (поэтому FOO_RED равно null). Затем статические поля инициализируются в порядке их появления. поэтому можно наблюдать поле FOO_RED до его инициализации.

1 голос
/ 27 мая 2011

Порядок имеет значение для статических полей, так как они инициализируются сверху вниз. В вашем случае переключение порядка приводит к вызову конструктора Foo () перед инициализацией FOO_RED. Таким образом, FOO_RED будет null для использования в конструкторе. Это законно, хотя, очевидно, бесполезно для любых элементов управления, которые хотели бы использовать FOO_RED.

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