Почему нет глобальных переменных в java, таких как С++?

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

Ответ 1

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

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

Ответ 2

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

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

  • сложнее протестировать - прочитайте Сообщение Miško Havery

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

    • Откуда это происходит?
    • где еще он читается?
    • где еще он изменен?
    • как я могу узнать, каково его текущее значение?
    • где он задокументирован?

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

Ответ 3

Некоторые допустимые глобальные "переменные" - это константы;-) например: Math.PI

Ответ 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 для проверки доступа к полям.

Изменить: Если вы делаете хоть что-то пополам, я могу понять, почему.