2011-02-01 2 views
5

Почему так, что когда я читаю код других, я часто вижу широкое использование «глобальных переменных»?Использование глобальных переменных

Например, в Java-коде:

public class SomeClass { 
    Button btn1; 
    private void someMethod() { 
     btn = new Button(); 
    } 
} 

btn1 объявлен как «глобальный» и «удобный» переменная для использования в качестве легкого доступа по всему классу. Но когда на нем нет модификатора, он по умолчанию использует доступ по умолчанию в Java.

Это может быть риск для безопасности? Почему люди не объявляют их с помощью частного модификатора сразу, если они планируют использовать их только в одном конкретном классе?

+7

Я не знаю, кто эти «люди», я всегда объявляю свои поля частными, если у меня нет веской причины не делать этого. – biziclop

+0

Я думаю, что сложно ответить, почему некоторые люди делают это, мы не знаем их уровня;) В общем, вы правы, это может привести к ошибкам. – Maxym

+0

Пожалуйста, используйте заголовок, который является вопросом (на который можно ответить), например. «По какой причине я должен использовать модификатор доступа по умолчанию вместо частного?» – Zeemee

ответ

3
  1. btn1 не является глобальной переменной. это переменная экземпляра класса
  2. , если не указан модификатор доступа, тогда он по умолчанию имеет доступ к уровню «пакет», т.е. btn1 доступен для всех классов, принадлежащих к тому же пакету, что и SomeClass
  3. , если SomeClass просто держатель данных и неизменяемый (нет сеттеров и т. д.), тогда это совершенно нормально.
  4. Всегда лучше быть как можно более ограничительным, когда дело доходит до переменных экземпляра.
+3

Я полностью не согласен с 4. Я думаю, что всегда лучше быть как можно более ограничительным с переменными: обычно делайте их частными, и если вы * можете * сделать их «final», тогда сделайте это. –

+0

@ Jon Skeet - Мой плохой я хотел сказать больше там ... Английский не первый язык ;-) –

+1

Достаточно честный :) Я до сих пор не согласен с пунктом 3, но там мы идем ... –

5

Это не глобальная переменная (существует ли такая вещь даже в Java? Я думаю, это зависит от определения глобального). Он по-прежнему является членом класса.

The default visibility is package-private, поэтому переменная не является общедоступной, но к ней могут быть доступны другие классы в одном пакете.

Обычно нужно стремиться к «наилучшей» инкапсуляции данных, но могут быть случаи, когда это подходит.

+1

Ближайшей вещью к глобальной переменной в Java, вероятно, будет переменная 'public static', которая не является« final ». –

+0

Что делает 'final'? 'public static' является глобальным, даже если ссылка является неизменной. –

+0

@Steve: если бы это было 'final', то я бы не назвал его« переменной », а скорее константой (да, тип может быть изменчивым ...). –

1

частный/общественный не имеет никакого отношения к безопасности, он должен ограничивать область применения/использования вашего кода.

Тем не менее было бы хорошей практикой назвать их такими, какими они должны быть: поэтому, если они должны быть частными, сделайте их частными.

1

В Java нет такой вещи, как «global». Существует только открытый, закрытый, защищенный и дефолтный. По умолчанию обычно игнорируются переменные класса, поскольку он прерывает инкапсуляцию.

Почему люди не объявляют их с помощью частного модификатора сразу, если они планируют использовать их только в одном конкретном классе?

* Потому что они не знают/не заботятся/непослушный /, чтобы досадить вам +

* ненужное зачеркнуть + conspiricy теоретики только

3

Это не глобальная переменная. Он имеет доступ по умолчанию, поэтому он не отображается глобально, и это член экземпляра, что означает, что он имеет область действия SomeClass. Ближайшим эквивалентом глобальной переменной в Java является публичное статическое поле в публичном классе. Даже в этом случае он только глобальный по отношению к загрузчику классов для используемого класса контейнера - другой загрузчик классов, работающий в одной JVM, и загрузка одного и того же класса контейнера будет иметь отдельную статическую переменную.

Сказав все это, я лично не одобряю поля, являющиеся чем-то иным, чем частным, для содействия инкапсуляции. (Это не дает вам инкапсуляции само по себе, но это начало.) Поля являются частью реализации класса, который должен быть модифицируемым, не затрагивая никого, только полагаясь на API класса ,

1

Если ваш вопрос

Почему люди не объявлять их с собственным модификатором сразу

тогда мой ответ будет: Потому что они ленивы.

Смежные вопросы