В моем приложении я использую некоторые значки. Где я должен сохранить путь каталога, содержащего те значки?
Значки используются в различных классах, таким образом, действительно не имеет смысла хранить их в одном из тех классов в частности.
Я считал, что глобальные переменные являются злыми, но это приемлемый для использования класса (например, Commons
) содержа только public static final
поля для хранения этого короля данных? Какое решение используется в профессиональных приложениях?
Глобальные константы
Как отмечают другие, глобальные константы не имеют такого же негативного оттенка, как глобальные переменные. Глобальные переменные затрудняют отладку и сопровождение программы из-за неконтролируемых модификаций. Глобальные константы (public static final
) не создают такой проблемы
Тем не менее, объектно-ориентированный подход предполагает привязку кода близко к его данным для повышения понятности и удобства сопровождения. Вам все еще нужно найти правильный баланс между хранением глобальных значений конфигурации в глобальном классе и хранением данных рядом с кодом, который будет их использовать.
Возможно, здесь также стоит напомнить, что, поскольку компилятор может инлайнить некоторые константы, если вы измените значение константы, вам, возможно, придется перекомпилировать и развернуть не только класс, содержащий константы.
Экстернализация значений
Вы также спросили о том, что делают профессиональные приложения. Нередко в таких приложениях такие типы значений, как пути к файлам, настраиваются извне. Это зависит от того, насколько вероятно изменение значения (т.е. насколько вероятно, что ваше приложение переедет или ваш код будет использоваться в другом приложении) и насколько удобно или легко перекомпилировать и развернуть код с новыми значениями. Если вы решили сделать некоторые значения настраиваемыми извне, вы все равно можете захотеть закодировать в коде значения по умолчанию для этих элементов.
Вот некоторые способы внешнего кодирования этих значений и несколько ссылок для начала работы. Это, конечно, не исчерпывающий список:
Я бы рекомендовал включать их (значки) в файлы классов в банке, скажем, папка с именем resources, и только загрузчик значков должен знать имя папок ресурсов в вашей банке.
Вы имеете в виду константы, а не глобальные переменные, поэтому не беспокойтесь о том, что они злые - это не так, потому что они не меняются.
Имейте в виду, что в случае, если эти «константы» действительно настраиваются, вам лучше передать объект Configuration
методам, которым он нужен. Что ж, у вас могут быть статики где-то, но с точки зрения тестируемости их необходимо вводить / передавать.
Глобальные переменные - это не то же самое, что глобальные константы. Глобальные переменные плохи потому, что их можно изменить в любом месте кода, и очень трудно отследить ошибки, возникающие из-за того, что глобальная переменная не находится в ожидаемом состоянии. Глобальные константы всегда будут находиться в ожидаемом состоянии, потому что их никогда нельзя случайно изменить.
Глобальные переменные - зло (поскольку из-за них почти невозможно выяснить, кто и что изменяет), но константы - не зло. public static final String
поля - это хорошо, поскольку их нельзя изменить.
В общем, я бы предложил, чтобы этот конкретный случай был проблемой упаковки и ссылаться на элементы не как на файлы в файловой системе, а как на элементы в classpath и загрузите их через загрузчик классов. Для этого необходимо указать их местоположение в пути к классам вашего приложения.
Тогда должен быть только один класс, который знает, как получать эти значки, а весь другой код запрашивает у этого класса значки, которые ему нужны.