Почему в Java нет глобальных переменных, таких как C ++? - PullRequest
12 голосов
/ 28 января 2010

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

Ответы [ 11 ]

44 голосов
/ 28 января 2010

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

Однако, вам бы посоветовали не делать этого - это делает менее элегантным, сложным в обслуживании и трудным для тестирования кода.

10 голосов
/ 28 января 2010

Глобальные переменные (в контексте Java - public static переменные) плохие, потому что:

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

  • сложнее проверить - прочитайте пост Мишко Хавери

  • труднее читать - когда кто-то видит код, он удивляется:

    • откуда это взялось?
    • где еще это читается?
    • где еще это модифицируется?
    • как узнать текущее значение?
    • где это задокументировано?

Чтобы сделать одно пояснение, которое кажется необходимым - переменные! = Константы. Переменные меняются, и в этом проблема. Так что иметь public static final int DAYS_IN_WEEK = 7 совершенно нормально - никто не может его изменить.

9 голосов
/ 28 января 2010

Некоторые допустимые глобальные «переменные» являются константами ;-), например: Math.PI

7 голосов
/ 28 января 2010

C ++ - мультипарадигма , тогда как Java - pure"почти исключительно" объект ориентированный . Объектно-ориентированный означает, что каждый кусок данных должен быть внутри объекта.

Пожалуйста, смотрите ссылки для получения дополнительной информации.

5 голосов
/ 28 января 2010

Почему глобалы злые, объяснено здесь .

2 голосов
/ 29 января 2010

Я просто хотел добавить, что если вы хотите использовать постоянную глобальную переменную, это безопасно. Чтобы использовать его, используйте ключевое слово final. Пример:

public static final int variable;
2 голосов
/ 28 января 2010

Если вам нужен определенный ресурс, доступ к которому из любой части вашей программы, взгляните на Singleton Design Pattern .

1 голос
/ 29 января 2010

Глобальные переменные плохо сочетаются с ООП. Тем не менее можно иметь константы в качестве глобальных переменных. В некотором смысле singleton являются глобальными переменными. Если вы хотите иметь константы в качестве глобальных переменных, лучше вместо них использовать enums.

EDIT:

Константы, которые раньше вызывались как Class.Constant, теперь могут использовать Constant с помощью static import. Это максимально приближено к глобальным переменным в C ++.

0 голосов
/ 30 января 2010

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

Изменить: Если вы голосуете вниз, по крайней мере, прокомментируйте, чтобы я мог понять, почему.

0 голосов
/ 28 января 2010

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

По определению, то, что зависит от "глобальной переменной", не является полностью переносимым или полностью повторно используемым. Это зависит от этой глобальной переменной, существующей в новой (повторно используемой) системе, и от кода в новой (повторно используемой) системе, управляющей этой глобальной переменной. В этот момент вам лучше поместить эту глобальную переменную в отдельный объект.

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