Как сделать переменную глобальной java

Обновлено: 04.07.2024

У меня есть класс Java, который запускает 2 отдельных потока. Первый поток запускается нормально, и все переменные верны. Когда я запускаю второй поток, глобальные переменные из потока один изменяются на значения, установленные в потоке 2. Я пробовал добавлять синхронизированные блоки, где.

Это скорее вопрос о хорошем стиле программирования. Обычно я работаю с Java, а теперь немного работаю с Python. В Python нет необходимости передавать глобальные переменные, если вы хотите только читать из них. С другой стороны, я думаю, что синтаксис Java более полезен в его отношении. Вы должны.

Для определения глобальной переменной можно использовать ключевое слово static

теперь вы можете получить доступ к a и b из любого места, позвонив по телефону

Вы не. Это сделано специально. Ты не должен этого делать, даже если бы мог.

При этом вы можете создать набор общедоступных статических членов в классе с именем Globals.

но вы действительно не должны :). Серьезно .. не делайте этого.

Другой способ-создать интерфейс, подобный этому:

Любой класс, который должен их использовать, должен только реализовать интерфейс:

Вам лучше использовать инъекцию зависимостей:

Причина, по которой вы используете геттеры и сеттеры таким образом, а не просто делаете переменную общедоступной, заключается в следующем. Допустим, ваш var будет глобальным параметром, который вы NEVER хотите, чтобы кто-то изменил во время выполнения вашей программы (в случае, когда вы разрабатываете код с командой), что-то вроде URL для веб-сайта. Теоретически это может измениться и может использоваться много раз в вашей программе, поэтому вы хотите использовать глобальный var, чтобы иметь возможность обновлять его все сразу. Но вы не хотите, чтобы кто-то другой вошел и изменил этот var (возможно, не понимая, насколько это важно). В этом случае вы просто не включаете метод setter, а включаете только метод getter.

В Java нет глобальной переменной

Тем не менее, у нас есть ключевое слово static , и это все, что нам нужно. В Java ничего не существует вне класса. Ключевое слово static представляет переменную класса, которая, в отличие от переменной экземпляра, имеет только одну копию и которая выходит за пределы всех созданных экземпляров этого класса, что означает, что ее значение может быть изменено и доступно во всех экземплярах в любой момент.

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

У меня есть проблема, когда я устанавливаю некоторые глобальные переменные внутри функции. Но когда я иду, чтобы получить доступ к этим глобальным переменным вне функции (в основной части скрипта), эти глобальные переменные никогда не были установлены? Почему следующие глобальные переменные всегда.

Я все еще новичок в разработке приложений android. У меня есть таблица в базе данных QSLite, которая дает мне ключевые параметры о каждом пользователе. Типичная таблица прилагается как изображение ниже; Когда пользователь входит в приложение, я хотел бы установить определенные константы, которые я.

Ничто не должно быть глобальным, за исключением констант.

Поместите это в свой основной класс. В других файлах .java используйте его через:

Убедитесь, что при перемещении кода с пола разделочной комнаты и в выпуске вы удаляете или комментируете эту функциональность.

Если у вас есть метод рабочей лошадки, например рандомизатор, я предлагаю создать пакет "Toolbox"! Все кодеры должны иметь один, а затем, когда вы захотите использовать его в .java, просто импортируйте его!

По правде говоря, в программе java OO нет понятия "GLOBAL"

Тем не менее, в вашем вопросе есть доля правды, потому что в некоторых случаях вы захотите запустить метод в любой части программы. Для метода example---random() в приложении Phrase-O-Matic;это метод, который должен вызываться из любого места программы.

Таким образом, для того, чтобы удовлетворить такие вещи, как выше "We need to have Global-like variables and methods"

ЧТОБЫ ОБЪЯВИТЬ ПЕРЕМЕННУЮ ГЛОБАЛЬНОЙ.

ЧТОБЫ ОБЪЯВИТЬ МЕТОД ГЛОБАЛЬНЫМ .

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

NOTE : X может быть либо именем метода, либо именем переменной в соответствии с требованиями, а ClassName-это имя класса, в котором вы их объявили.

В Java нет такой вещи, как действительно глобальная переменная. Каждая статическая переменная должна принадлежать какому-либо классу (например, System.out), но когда вы решите, в какой класс она войдет, вы можете ссылаться на нее отовсюду, загруженного одним и тем же загрузчиком классов.

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

Таким образом, вы можете получить к ним доступ с помощью GlobalClass.x и GlobalClass.s

вы можете позвонить куда угодно:

Понимание проблемы

Я рассматриваю квалификацию глобальной переменной как переменную, к которой можно получить доступ и изменить ее в любом месте кода, не заботясь о вызове статического/экземпляра или передаче какой-либо ссылки из одного класса в другой.

Обычно если у вас есть класс а

и хотите получить доступ и обновить myvar в классе B,

вам нужно будет иметь ссылку на экземпляр класса A и обновить значение в классе B следующим образом:

Решение

Поэтому мое решение этой проблемы (даже если я не уверен, что это хорошая практика) состоит в том, чтобы использовать singleton:

Теперь вы можете получить глобальный уникальный экземпляр в любом месте с помощью:

В Java нет глобальных переменных, но есть глобальные классы с открытыми полями. Вы можете использовать функцию статического импорта java 5, чтобы она выглядела почти как глобальные переменные.

Как вы, вероятно, догадываетесь из ответа, в Java нет глобальных переменных, и единственное, что вы можете сделать, это создать класс со статическими членами:

Вы можете использовать его с Global.a в другом месте. Однако, если вы используете Java 1.5 или лучше, вы можете использовать магию import static , чтобы она выглядела еще более реальной глобальной переменной:

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

Обычно глобальную переменную (я предполагаю,что вы сравниваете ее с C, Cpp) определяют как public static final

ENUMs также полезны в таком сценарии :

Создание независимого файла, например Example.java для использования 1-го решения, просто отлично. Вы можете сделать это также в приложении, если, например, глобальные переменные являются особыми для вашего текущего приложения и т. Д.:

Создайте класс в начале и объявите там свои переменные:

Затем вы можете получить доступ к этим переменным, используя их как " Globals.month_number " и т. Д. -- из averywhere в вашем приложении.

Если вам нужно обновить глобальное свойство, в качестве глобальной переменной можно использовать простой класс-оболочку getter/setter. Типичный пример приведен ниже.

В общем случае Java не имеет никаких глобальных переменных. Кроме локальных переменных, все переменные подпадают под область действия любого класса, определенного в программе. Мы можем иметь статические переменные, чтобы иметь область действия глобальных переменных.

Исходя из концепции, глобальные переменные, также известные как переменные экземпляра,являются переменными уровня класса, т. Е. Они определены внутри класса, но вне методов. Чтобы сделать их полностью доступными и использовать их напрямую, укажите ключевое слово static. Итак, если я пишу программу для простой арифметической операции, и для нее требуется пара чисел, то две переменные экземпляра определяются как таковые:

Кроме того, использование статического ключевого слова перед переменными экземпляра позволяет нам не указывать типы данных для одних и тех же переменных снова и снова. Просто напишите переменную напрямую.

без static это тоже возможно:

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

Проблема с созданием "global variables" заключается в том, что это не отраслевой стандарт для Java. Это не отраслевой стандарт, потому что он позволяет нескольким классам манипулировать данными асинхронно, если вы используете многопоточное приложение, это становится немного сложнее и опасно с точки зрения потокобезопасности. Существуют и другие причины , по которым использование глобальных переменных неэффективно, но если вы хотите избежать этого, я предлагаю вам прибегнуть к аспектно-ориентированному программированию .

Аспектно-ориентированное программирование сводит на нет эту проблему, поставив родительский класс ответственным за область действия через нечто под названием "advices", которое добавляет дополнительное поведение к коду, фактически не изменяя его. Он предлагает решения для межсекторальных проблем или глобального использования переменных.

Spring -это фреймворк Java, который использует AOP, и хотя он традиционно используется для веб-приложений, основное приложение может использоваться универсально во всем фреймворке Java (включая 8.0). Это может быть направление, которое вы хотите исследовать больше.

Для определения глобальной переменной можно использовать ключевое слово static

теперь вы можете получить доступ к a и b из любого места, позвонив по телефону

Г / г right. specially в J2ME. Вы можете избежать NullPointerException, поместив в свой конструктор MidLet (инициализация proggy) эту строку кода:

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

Похожие вопросы:

Как я могу записать все эти глобальные переменные C++ в Java? //Global variables int charClass; char lexeme [100]; char nextChar; int lexLen; int token; int nextToken; extern string word(Apple);

Возможный Дубликат : Где поместить глобальные переменные в Rails 3 Можно ли установить глобальные переменные всего сайта в Ruby на Rails?

Возможные Дубликаты : Почему в Java нет глобальных переменных? Глобальные переменные в Java Привет, Есть ли какой-нибудь способ объявить глобальные переменные в java? или что-то с широким размахом.

У меня есть класс Java, который запускает 2 отдельных потока. Первый поток запускается нормально, и все переменные верны. Когда я запускаю второй поток, глобальные переменные из потока один.

Это скорее вопрос о хорошем стиле программирования. Обычно я работаю с Java, а теперь немного работаю с Python. В Python нет необходимости передавать глобальные переменные, если вы хотите только.

У меня есть проблема, когда я устанавливаю некоторые глобальные переменные внутри функции. Но когда я иду, чтобы получить доступ к этим глобальным переменным вне функции (в основной части скрипта).

Я все еще новичок в разработке приложений android. У меня есть таблица в базе данных QSLite, которая дает мне ключевые параметры о каждом пользователе. Типичная таблица прилагается как изображение.

Я хочу поддерживать глобальные переменные в моем крошечном компиляторе. Нужно ли мне сделать базовый блок global, который будет содержать все остальные базовые блоки и глобальные переменные, или я.

Мне интересно, как настроить глобальные переменные в Citrus в pure Java. В цитрусовых documentnation есть пример как это сделать в XML но есть ли способ сделать это в Java?

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

Возможно, вам следует отредактировать свой вопрос, включив в него пример кода, иллюстрирующего, что именно вы хотите. Это поможет нам порекомендовать лучшее решение.

Чтобы определить глобальную переменную, вы можете использовать статическое ключевое слово

теперь вы можете получить доступ к a и b из любого места позвонив

Будьте осторожны при этом - когда класс Global выгружается, переменные будут неопределенными null. Если вы продадите свое приложение, это произойдет рано или поздно, и вы будете искать ошибки везде, но не там .

О выгрузке классов: если существует какая-либо сильная цепочка ссылок от любого корня GC до экземпляра Global или его дочерних элементов или какая-либо ссылка во время компиляции из загруженного и не выгружаемого класса в Global, то объект Class относительно Global сильно достижимый, и, следовательно, так же ClassLoader, который загрузил Global; что делает невозможным выгрузку Global (поскольку выгрузка класса может произойти только после того, как GC полностью удалит любую сильную ссылку на ClassLoader, который загрузил данный класс). Если у вас нет ссылок вообще, как разгрузка может быть проблемой .

@Abi Я бы посоветовал вам переименовать ваш класс из Global в другой ( TestClass ?), Чтобы у людей не сложилось впечатление, что существует такая вещь, как ключевое слово Global Java. Береженого Бог бережет :)

Нет. Это по дизайну. Вы не должны этого делать, даже если бы могли.

При этом вы можете создать набор открытых статических членов в классе с именем Globals.

но вы действительно не должны:). Серьезно.. не делай этого.

как я писал выше - когда класс выгружается, переменные теряют свои значения до нуля, и ваше приложение вылетает.

Тогда каков лучший способ, которым я могу объявить константы, чтобы все методы класса могли получить к ним доступ?

Другой способ - создать такой интерфейс:

Любой класс, который должен их использовать, должен реализовать интерфейс:

Мне интересно, почему у этого ответа (до моего) нет повышающих голосов. Разве он не дает разумного альтернативного ответа на этот вопрос, который дают все остальные ответы?

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

Кроме того, из JDK 1.5+ вы можете использовать статический импорт для ваших глобальных переменных, реализация не требуется.

Правильно, это на самом деле ничего не объясняет, просто говорит, что в какой-то книге говорилось, что это плохо

Вам лучше использовать инъекцию зависимостей:

Вообще говоря, в программе java OO нет понятия "GLOBAL"

Тем не менее, есть какая-то правда, стоящая за вашим вопросом, потому что будут случаи, когда вы хотите запустить метод в любой части программы. Например, метод random() в приложении Phrase-O-Matic, метод должен быть доступен из любой точки программы.

Итак, чтобы удовлетворить такие вещи, как выше "Нам нужны глобальные переменные и методы"

ЗАКЛЮЧИТЬ ПЕРЕМЕННЫЙ КАК ГЛОБАЛЬНЫЙ.

ЗАКЛЮЧИТЬ МЕТОД КАК ГЛОБАЛЬНЫЙ.

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

ПРИМЕЧАНИЕ: X может быть именем метода или именем переменной в соответствии с требованием, а ClassName - это имя класса, в котором вы его объявили.

Причина, по которой вы используете геттеры и сеттеры таким образом, а не просто делаете переменную общедоступной, заключается в следующем. Допустим, ваш var будет глобальным параметром, который вы НИКОГДА не хотите, чтобы кто-то изменил во время выполнения вашей программы (в случае, когда вы разрабатываете код с командой), что-то вроде, возможно, URL-адреса веб-сайта. Теоретически это может измениться и может многократно использоваться в вашей программе, поэтому вы хотите использовать глобальную переменную, чтобы иметь возможность обновлять все сразу. Но вы не хотите, чтобы кто-то другой вошел и изменил эту переменную (возможно, даже не осознавая, насколько это важно). В этом случае вы просто не включаете метод установки, а только метод получения.

В Java нет глобальной переменной

Тем не менее, у нас есть static ключевое слово, и это все, что нам нужно. Ничто не существует вне класса в Java. Ключевое слово static представляет переменную класса, которая, в отличие от переменной экземпляра, имеет только одну копию и которая распространяется на все экземпляры этого класса, что означает, что ее значение можно изменить и получить доступ ко всем экземплярам в любой точке.

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

Ничто не должно быть глобальным, кроме констант.

Поместите это в свой основной класс. В других .java файлах используйте его через:

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

Если у вас есть метод workhorse, например рандомизатор, я предлагаю создать пакет "Toolbox"! Все кодеры должны иметь один, тогда всякий раз, когда вы хотите использовать его в .java, просто импортируйте его!

В Java нет такой вещи, как действительно глобальная переменная. Каждая статическая переменная должна принадлежать к некоторому классу (например, System.out), но когда вы решили, какой класс он войдет, вы можете ссылаться на нее повсюду, загружаемую одним и тем же загрузчиком классов.

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

Java не предоставляет глобальную переменную функционально, но если вы хотите иметь концепцию глобальной переменной, мы можем использовать ключевое слово static

Переменная является основной единицей хранения в программе Java. Переменная определяется комбинацией идентификатора, типа и необязательного инициализатора. Кроме того, все переменные имеют область видимости, которая определяет их видимость и время жизни. Эти элементы рассматриваются далее.

Объявление переменной

В Java все переменные должны быть объявлены перед использованием. Основная форма объявления переменной показана здесь:


идентификатор типа [= значение] [, идентификатор [= значение]…];

  • Тип является одним из атомарных типов Java (Типы данных) или именем класса или интерфейса. (Мы обсудим класс и типы интерфейса позже).
  • Идентификатор — это имя переменной.
  • Вы можете инициализировать переменную, указав знак равенства и значение. Помните, что выражение инициализации должно приводить к значению того же (или совместимого) типа, что указано для переменной.
  • Чтобы объявить более одной переменной указанного типа, используйте список через запятую.

пример


int a, b, c; // объявляет три целых, a, b и c.

int d = 3, e, f = 5; // объявляет еще три целых числа, инициализируя // d и f.

байт z = 22; // инициализирует z.

двойной пи = 3,14159; // объявляет приближение числа пи

char x = ‘x’; // переменная x имеет значение ‘x’.

логическое d = ложь; // логическое значение, инициализированное значением false;

Выбранные вами идентификаторы не имеют ничего общего с их именами

Динамическая инициализация

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

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

В предыдущем разделе мы говорили о переменных внутри методов. Переменные, которые вы устанавливаете внутри методов, доступны только этим методам. Они не доступны для других методов. То есть, они имеют локальный охват.

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

Добавьте следующие четыре строки в ваш новый класс Sales из предыдущего урока:

Мы устанавливаем четыре переменные String (четыре строковых экземпляра). Как следует из названий экземпляров нашего класса Sales, строки будут содержать имя работника, его должность, количество продаж и его зарплату.

Эти четыре экземпляра класса будут доступны для всех методов, которые мы напишем в этом классе, и они не будут локальными для какого-либо одного метода. То есть, они имеют глобальный охват.

Чтобы увидеть, насколько они глобальны, вернитесь в класс Branch, класс с методом main. Добавьте следующую строку кода, чтобы создать новый объект класса Sales:

Это то же самое, что мы делали в предыдущем разделе - использовали ключевое слово new для создания нового объекта. Имя объекта будет aWorker, и оно имеет тип от Sales, который является нашим классом.

В следующей строке введите имя переменной (aWorker), а затем точку. После NetBeans отобразит всплывающий список методов и свойств, доступных вашему объекту:

Четыре экземпляра, которые мы настроили, находятся в списке. Это не методы, а то, что называется свойством. Тот факт, что они вообще есть в списке, означает, что они имеют глобальный охват. Если бы у них был локальный охват, их бы не было в списке.

Вы можете установить значения для свойств. Попробуйте это: добавьте следующий выделенный код в ваш метод main (выделено синим цветом):

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

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

Чтобы сделать переменную экземпляра доступной только для определенного класса, вы добавляете ключевое слово в Java private непосредственно перед объявлением экземпляра. Измените код в классе Sales на это:

Теперь только код в классе Sales может видеть эти переменные экземпляра класса. Чтобы проверить, вернитесь к методу main, и вы увидите следующие предупреждения и красные подчеркивания:

Удалите три строки снизу. Введите aWorker, а затем снова точку, чтобы увидеть всплывающий список NetBeans:

Как видите, четыре переменные экземпляра нашего класса исчезли. Они исчезли, потому что у них больше нет глобальной области видимости, и, следовательно, их нельзя увидеть из класса Branch. (Красное подчеркивание говорит лишь о том, что строка еще не дописана и Java-программа расценивает это как ошибку.)

В следующем уроке вы узнаете о том, что называется конструктором класса.

Читайте также: