Где хранить глобальные переменные, такие как пути к файлам в Java? - PullRequest
7 голосов
/ 11 апреля 2010

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

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

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

Ответы [ 6 ]

7 голосов
/ 11 апреля 2010

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

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

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

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

Внешние значения

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

Вот несколько способов экстернализации этих значений и некоторые ссылки, с которых можно начать. Это, конечно, не исчерпывающий список:

4 голосов
/ 11 апреля 2010

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

3 голосов
/ 11 апреля 2010

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

2 голосов
/ 11 апреля 2010

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

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

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

1 голос
/ 11 апреля 2010

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

0 голосов
/ 11 апреля 2010

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

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

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