Как сохранить переменную в JVM - PullRequest
2 голосов
/ 07 сентября 2010

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

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

РЕДАКТИРОВАТЬ 1:

Мне нужно будет обновить значение переменной.

РЕДАКТИРОВАТЬ 2:

Я ценю ответы, ребята.Я программист .net и не использовал Java с колледжа.Еще раз спасибо.

Ответы [ 4 ]

5 голосов
/ 07 сентября 2010

Да, используя поле static:

public class GlobalVariableHolder {
    public static int globalVariable;
}

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

Если вы все еще уверены, что вам это нужно, для максимально возможной защиты используйте синхронизацию.,Еще лучше, если переменная будет примитивной (int, long и т. Д.), Вы можете использовать метод AtomicInteger getAndAdd() или addAndGet().

2 голосов
/ 07 сентября 2010

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

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

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

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

Позже вы можете захотеть переместить код, который манипулирует этой переменной, в объект-синглтон и, возможно, преобразовать синглтон во что-то, что вы можете получить через IOC, но иметь синглтон гораздо лучше, чем начинать с общедоступной статики. 1009 *

1 голос
/ 07 сентября 2010

Вы имеете в виду что-то, что будет существовать при нескольких вызовах java.exe, или вы имеете в виду одну переменную, которая будет в одном и том же месте в памяти независимо от того, какой поток в java.exe обращается к ней?Или вы имеете в виду переменную, доступ к которой возможен только при использовании JRockit?Или, может быть, просто JVM на вашем компьютере разработчика, но не в другой системе?

В первом случае вам потребуется другой способ его хранения, например, файл конфигурации.

ВВо втором случае, как говорит Божо, используйте ключевое слово * 1005.

В третьем случае вам, вероятно, потребуется использовать класс System и определить производителя JVM (при условии, что это доступно из System - I'mЯ не уверен в этом, и вы узнаете больше, если сами посмотрите API).

В четвертом случае вы почти вернулись к файлу конфигурации.

0 голосов
/ 07 сентября 2010

Не получит никаких наград, но это должно работать: package mypackage;</p> <p>public class MyGlobal { public static String MY_GLOBAL_VAR = "my variable"; } Любой класс в этом экземпляре JVM сможет получить доступ к MyGlobal.MY_GLOBAL_VAR.Обновлено, чтобы разрешить обновление.

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