Почему в java нет глобальных переменных? Если мне нравится использовать любую переменную во всех классах программы, то как я могу это сделать?
Почему нет глобальных переменных в java, таких как С++?
Ответ 1
Если вы действительно хотите это сделать, сделайте его общедоступной статической переменной.
Однако вам следует попытаться не делать этого - он делает менее элегантным, сложнее поддерживать, сложнее проверить код.
Ответ 2
Глобальные переменные (в контексте Java - public static
) являются плохими, потому что:
-
сложнее поддерживать - вы не можете поставить точку останова или записать каждое изменение в переменную, поэтому неожиданным значениям во время выполнения будет очень сложно отслеживать и исправлять
-
сложнее протестировать - прочитайте Сообщение Miško Havery
-
сложнее читать - когда кто-то видит код, он задается вопросом:
- Откуда это происходит?
- где еще он читается?
- где еще он изменен?
- как я могу узнать, каково его текущее значение?
- где он задокументирован?
Сделать одно пояснение, которое кажется необходимым - переменные!= константы. Переменные меняются, и эта проблема. Таким образом, наличие public static final int DAYS_IN_WEEK = 7
отлично - никто не может его изменить.
Ответ 3
Некоторые допустимые глобальные "переменные" - это константы;-) например: Math.PI
Ответ 4
С++ - это мультипарадигма, тогда как Java чистый "почти исключительно"
ориентированный объект. Ориентация объекта означает, что каждая часть данных должна находиться внутри объекта.
Подробнее см. ссылки.
Ответ 5
Почему глобалы злы, объяснил здесь.
Ответ 6
Если вам нужен определенный ресурс, доступ к которому осуществляется из любой части вашей программы, просмотрите шаблон дизайна Singleton.
Ответ 7
Я просто хотел добавить, что если вы хотите использовать постоянную глобальную переменную в безопасности. Чтобы использовать его, используйте ключевое слово final. Пример:
public static final int variable;
Ответ 8
Глобальные переменные не хорошо подходят для ООП. Тем не менее, в качестве глобальных переменных могут быть константы. В некотором смысле singleton
являются глобальными переменными. Если вы хотите иметь константы в качестве глобальных переменных, лучше использовать enums
вместо.
EDIT:
Константы, которые использовались для вызова Class.Constant
, теперь могут использоваться Constant
с помощью static import
. Это приближается как можно ближе к глобальным переменным в С++.
Ответ 9
package foo;
public class Globals {
public static int count = 3;
}
Затем вы можете получить к нему доступ в любом месте, как
int uses_global = foo.Globals.count + 1;
Ответ 10
Java предназначен для создания полностью переносимых, полностью повторно используемых объектов.
По определению, что-то, что зависит от "глобальной переменной", не полностью переносимо или полностью повторно используется. Это зависит от этой глобальной переменной, существующей в новой (повторно используемой) системе, и зависит от кода в новой (повторно используемой) системе, управляющей этой глобальной переменной. В этот момент вам лучше помещать эту глобальную переменную в собственный объект.
Ответ 11
Вы можете использовать статический класс с синхронизированными полями и установками getters. прямые изменения в публичном статическом поле - плохая практика. по крайней мере, вы можете использовать методы get set для проверки доступа к полям.
Изменить: Если вы делаете хоть что-то пополам, я могу понять, почему.