Где сохранить глобальные переменные как пути к файлам в Java?

В моем приложении я использую некоторые значки. Где я должен сохранить путь каталога, содержащего те значки?

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

Я считал, что глобальные переменные являются злыми, но это приемлемый для использования класса (например, Commons) содержа только public static final поля для хранения этого короля данных? Какое решение используется в профессиональных приложениях?

7
задан Jules Olléon 11 April 2010 в 15:55
поделиться

6 ответов

Глобальные константы

Как отмечают другие, глобальные константы не имеют такого же негативного оттенка, как глобальные переменные. Глобальные переменные затрудняют отладку и сопровождение программы из-за неконтролируемых модификаций. Глобальные константы (public static final) не создают такой проблемы

Тем не менее, объектно-ориентированный подход предполагает привязку кода близко к его данным для повышения понятности и удобства сопровождения. Вам все еще нужно найти правильный баланс между хранением глобальных значений конфигурации в глобальном классе и хранением данных рядом с кодом, который будет их использовать.

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

Экстернализация значений

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

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

7
ответ дан 6 December 2019 в 11:47
поделиться

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

3
ответ дан 6 December 2019 в 11:47
поделиться

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

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

Имейте в виду, что в случае, если эти «константы» действительно настраиваются, вам лучше передать объект Configuration методам, которым он нужен. Что ж, у вас могут быть статики где-то, но с точки зрения тестируемости их необходимо вводить / передавать.

2
ответ дан 6 December 2019 в 11:47
поделиться

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

1
ответ дан 6 December 2019 в 11:47
поделиться

Глобальные переменные - зло (поскольку из-за них почти невозможно выяснить, кто и что изменяет), но константы - не зло. public static final String поля - это хорошо, поскольку их нельзя изменить.

4
ответ дан 6 December 2019 в 11:47
поделиться

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

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

0
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

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