Это не так.
Две фундаментальные проблемы с глобальными переменными - это просто загромождение пространства имен и тот факт, что «никто» не «контролирует» их (таким образом, потенциальные коллизии и конфликты с несколькими потоками).
«Глобальность плоха», как и почти любая другая компьютерная программа, является руководством, а не жестким и быстрым правилом. Когда создаются такие «правила», лучше всего просто принять правило наизусть, чтобы понять обстоятельства и мотивы создания правила. Не принимайте их вслепую.
В вашем случае вы, похоже, поняли природу вашей системы и аргументы вокруг правила и решили, что в этом случае оно не применимо. Вы правы, это не так.
Так что, не беспокойтесь об этом.
У меня работает ....
Я должен добавить, что это результаты использования Sun JRE 1.6.0_12, и это поведение не определено, по крайней мере, в спецификациях API (или мне не удалось его найти), поведение может отличаться.
Существуют ли какие-либо инструменты для отслеживания изменений времени выполнения
Насколько мне известно, нет. Однако, если нужно проверить, были ли изменения в свойствах системы, можно одновременно сохранить копию Properties
и сравнить ее с другим вызовом System.getProperties
- в конце концов, Properties
является подклассом Hashtable
, поэтому сравнение будет выполняться аналогичным образом.
Ниже приведена программа, которая демонстрирует способ проверки наличия произошли изменения в свойствах системы. Наверное, не изящный метод, но, похоже, он выполняет свою работу:
потоки могут использовать одно Свойства
объект без необходимости внешнего
синхронизация., Сериализованная форма
На каждую виртуальную машину приходится одна копия свойств. У них почти те же проблемы, что и у других статиков (включая синглтоны).
Я предполагаю, что в качестве хака вы вызываете System.setProperties
к версии Properties
, которая реагирует по-разному в зависимости в контексте (поток, стек вызовов, время суток и т. д.). Он также может регистрировать любые изменения с помощью System.setProperty
. Вы также можете установить SecurityManager
журналы проверки безопасности для соответствующих разрешений.
Да, «системные свойства» относятся к каждой виртуальной машине (хотя существует ряд «магических» свойств, которые содержат информацию о хост-системе, например: «os.name», «os. arch "и т. д.).
Что касается вашего второго вопроса: мне неизвестен такой инструмент, но если вас беспокоит изменение свойств системы, вы можете использовать специальный SecurityManager для предотвращения (и, возможно, даже отслеживать) изменения свойств системы.
Их область действия - запущенная JVM, но если у вас нет какого-либо эзотерического загрузчика классов, статическая переменная с объектом свойств будет делать то же самое, и с возможностью синхронизировать или делать все, что вы потребность.
Вы не говорите, какова ваша мотивация для использования системных свойств.
Мы используем Spring для нашей конфигурации и устанавливаем начальные свойства с помощью файла свойств, который вводится в XML. Изменения в конфигурации во время работы приложения выполняются с помощью JMX.
Конечно же, существует множество других способов изменить конфигурацию в Java с помощью файла свойств, конфигурации на основе xml и т. Д.