Должен ли я избегать использования STATIC Vaiables - PullRequest
4 голосов
/ 06 июня 2011

Я разрабатываю Java-API (не совсем API) в моем офисе, который будет содержать более 4000 констант. Таким образом, все команды могут использовать их напрямую. Сначала я думал создать их классы в соответствии с их типом и создать их статические объекты в отдельный класс. Так что кто-нибудь использует их напрямую.

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

* После меня любой, кто присоединится к этому проекту, может также добавить ограничение в мой класс Constant, не заботясь о производительности. Существует вероятность того, что многие из констант будут использоваться редко.

* Каждый член класса Constant будет представлять класс, который будет вести себя по-своему. Это может быть частью некоторого дерева наследования в дальнейшем. Так что использование enum может быть не очень хорошей идеей.

Ответы [ 4 ]

4 голосов
/ 06 июня 2011

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

  • Беспокойство о проблемах памяти статики неуместно.Если вам нужно 4000 значений, им придется где-то жить, верно?

  • Если люди будут добавлять значения во время выполнения, это звучит как одноэлементная карта или свойства (которые на самом деле просто карта) некоторых типов.Люди часто используют структуры внедрения зависимостей, такие как Spring или Guice, для управления такими вещами.

  • Если вы просто хотите добавить константы компиляции, вы можете сделать их статическими.Возможно, вы также захотите сделать их статическими финальными, они будут скомпилированы встроенными.

  • Весьма вероятно, что 4000 констант - очень плохая идея.Там, где я видел системы с большим количеством констант (более 100, даже), определенных в одном месте, обычно случается так, что люди забывают их определения и заканчивают тем, что используют свои собственные варианты, что побеждает цель (например,Я работал над системой с сотнями SQL-запросов, определенных в классе «Запросы». Конечно, люди сразу же игнорируют это, так как это скорее беспокоит поиск точного запроса, который вам нужен, чем накатывание собственногоВ конце концов, класс вырос до 1500 запросов, много точных дубликатов и много неиспользованных, большинство использовалось один раз. Совершенно бессмысленно).Я могу представить исключения, когда вы не «потеряете» вещи с соглашениями об именах, но если у вас нет такого варианта использования, это выглядит как действительно плохая идея.

  • Разделение ваших констант на перечисления дает вам безопасные ссылки.Это также делает вещи концептуально легче иметь дело с.Сравните:

-

public class Constants { 
   String WORK_ADDRESS;
   String WORK_PHONE;
   String HOME_ADDRESS;
   String HOME_PHONE;
}

с

public enum ADRESS{ WORK, HOME }
public enum PHONE { WORK, PHONE }

С чем бы вы предпочли работать?

3 голосов
/ 06 июня 2011

Производительность крайне маловероятна для этой конструкции.ОЗУ дешево.(Пример обычной цитаты: Преждевременная оптимизация - корень всего зла. )

С другой стороны, я не совсем уверен, как любой клиент-разработчик может запомнить и использовать 4000+ констант,Можете ли вы дать нам представление о том, что это за объект?

Вы можете, в зависимости от подробностей, которые вы нам не предоставили, сочтете полезным собирать константы в enum s.Перечисления без сохранения состояния легче понять, чем public static final переменные, если есть некоторые естественные группировки, которыми вы можете воспользоваться.

2 голосов
/ 06 июня 2011

Если вы не создаете большие массивы или очень длинные строки, 4000 значений данных не будут занимать много памяти. Я думаю, что тот пост, который вы цитировали, говорил о гораздо больших объемах данных.

Другой подход заключается в чтении значений из файла настроек.

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

2 голосов
/ 06 июня 2011

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

и что?

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

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

4000 констант, безусловно, int (4 октета) = 16000 октетов, даже не размером с иконку ^^

Я бы указал на Javadoc, чтобы доказать свою точку зрения

http://download.oracle.com/javase/1.4.2/docs/api/constant-values.html#java.awt.event.KeyEvent.CHAR_UNDEFINED

это декларация KeyEvent в Java, проверьте объявления ^^

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