Использование глобальных переменных - PullRequest
5 голосов
/ 01 февраля 2011

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

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 01 февраля 2011

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

Видимость по умолчанию: package-private , поэтому переменная не является общедоступной, но может быть доступна для других классов в том же пакете.

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

3 голосов
/ 01 февраля 2011

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

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

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

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

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

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

1 голос
/ 01 февраля 2011

В Java нет такой вещи, как "глобальная". Существует только общедоступный, частный, защищенный и по умолчанию. Значение по умолчанию обычно не одобряется для переменных класса, поскольку оно нарушает инкапсуляцию.

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

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

* при необходимости удалите + только теоретики заговора

1 голос
/ 01 февраля 2011

private / public не имеет ничего общего с безопасностью, это ограничивает область применения / использование вашего кода.

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

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