Подтвердить что ты не робот

Почему не рекомендуется косвенно обращаться к статическим членам?

Почему не рекомендуется косвенно обращаться к статическим членам? В Eclipse вы можете включить или отключить это предупреждение в разделе "Настройки" > "Java" > "Компилятор" > "Ошибка/предупреждения" > "Косвенный доступ к статическому элементу".

Пример, когда "Косвенный доступ к статическому члену" настроен на предупреждение:

JLabel label = new JLabel();
label.setAlignmentX(JLabel.CENTER_ALIGNMENT);       // causes warning    
label.setAlignmentX(Component.CENTER_ALIGNMENT);    // is ok
4b9b3361

Ответ 1

В дополнение к тому, что было сказано Марко Топольником, есть факт, что если JLabel должен был иметь статический член с тем же именем в будущем, простая перекомпиляция JLabel.java не вызовет вызов код, знакомый с константой, существующей в этом модуле. Вместо того, чтобы перекомпилировать код, он все равно с удовольствием использовал бы Component.CENTER_ALIGNMENT, несмотря на то, что исходный код ссылался на него.

В последней ссылке обязательно указывается статический член Component по имени CENTER_ALIGNMENT, тогда как первый будет ссылаться на элемент либо в Component, либо в любом подклассе до JLabel, если имя переопределяется в любом из них позже.

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

Ответ 2

Доступ к члену класса Component через JLabel дает ложное впечатление о том, что этот член специфичен для JLabel, где на самом деле это член Component и просто наследуется всеми его подклассами. Nothig теряется, обращаясь к нему через класс объявления, и определенно что-то выиграно в ясности.