2016-06-28 7 views
4

В моем коде я должен использовать некоторые постоянные значения, поэтому я создал вспомогательный классЗагрузка одну единственной константы в JVM из нескольких констант

public class ConstantUtility { 
    public final static String category1_name1="category1/name1"; 
    public final static String category1_name2="category1/name2"; 
    public final static String category1_name3="category1/name3"; 
    . 
    . 
    . 
    public final static String category2_name100="category2/name100"; 
    public final static String category2_name101="category2/name101"; 
    . 
    . 
    . 
} 

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

Константы 2000 года делятся на 6 категорий. Я пробовал использовать 6 статических классов, но все равно остался прежним. Когда jvm находит статический класс, он загружает каждую статическую переменную в память.

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

Вопрос: Как я могу загрузить только одну константу в память среди всех этих констант.

+1

Если это то, что они действительно выглядят, нет необходимости в любом из них. Просто вычислите их по мере необходимости. – EJP

+0

@ EJP. Я не понимаю, что вы пытаетесь сказать. Вы предлагаете использовать статические переменные. – Sudheer

+0

Вам не нужно хранить 2000 строк формы ''/category "+ i +"/name "+ j'. Вы можете вычислить те, которые вам нужны во время выполнения. – EJP

ответ

-2

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

+0

системные команды? вы имеете в виду собственный код? – Sudheer

+0

Да, переместите константу в файл и выполните команду grep с вашим постоянным именем и загрузите результат в переменную java. –

+0

@JPBose - Нет, это не правильный способ делать что-то. Это на самом деле ужасный путь как с точки зрения дизайна, так и с точки зрения производительности. – TheLostMind

3

И только для того, чтобы быть уверенным: вы спрашиваете об этом, потому что вы выполняете проект «встроенный вид»; и вы столкнулись с проблемами памяти; и вы сделали профилирование/анализ и обнаружили, что наличие этих строк в 2000 году является проблемой в вашей заявке? Потому что: если вы этого не сделали - что заставляет вас думать, что на самом деле у вас есть проблема, требующая от вас потратить на это время?

И примечание стороны: факт, что у вас есть 2000 констант; многие из них «не используются» ... очень многое указывает на то, что вам следует меньше беспокоиться о воздействии на такой дизайн на потребление памяти; но и по самому дизайну.

Честно говоря, это сильно пахнет с точки зрения «вероятно, не очень хорошего дизайна» в первую очередь.

+0

нет не встроен. – Sudheer

+0

Я с Jagermeister, @Sudheer, вы ожидаете, что машина сделает .5 которые понимают только 0 или 1 –

+0

@GauravaAgarwal, я не понял вашу точку зрения. – Sudheer

2

Вы можете создать свойства-файлы. Это простые текстовые файлы, в которых вы можете хранить пары «ключ-значение» и анализировать их с помощью стандартных классов Java: Properties

Тогда вы можете загружать только файлы, в которых вы нуждаетесь. Вы сказали, что разделили свои ценности на 6 категорий. Вы можете создать 6 файлов и загрузить только тот файл, который вам нужен, когда вам это нужно.

1

Это практика, которую часто видят.

  • В команде это вызывает ненужные циклы управления версиями/слияния.
  • Компилятор будет использовать источник, импортирующий константу в самом классе, а в .class больше не будет проживать импорт класса констант. Поэтому, если константа получает другое значение, устаревшее значение остается в классе использования (требуется ручная чистка + сборка).
  • Новый код разделен на два места, которые не «текут» как можно быстрее, а также для поиска и чтения.

Как вы упомянули, можно устранить проблему, имея несколько констант, определяющих классы/интерфейсы/перечисления.

Альтернативы (в некоторой степени) существуют.JAXB позволяет маршалировать между XML и Java-объектами.

@XmlAttribute("surname") 
public String surname; // <... surname="..."> 

Аннотацию, указанную выше, можно удалить, так как поле имеет точное название. Кстати: не вводите константы для значений аннотаций, так как аннотации могут быть обработаны.

Это показывает два способа введения константы, и добавить перечисление:

  • путем аннотирования - обрабатываемый в Java
  • отражением (неэффективно, хотя)
  • путем перечисления: enum Category1 { name1, name2 }

По общему признанию, он должен соответствовать прецеденту.

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

+0

Как генерировать перечисление из базы данных? Экземпляры перечисления предопределены во время компиляции, не так ли? –

+0

@BasilBourque Извините, я имел в виду, что можно создать для таблиц DB с перечислениями SQL или значениями строк java-источников, которые затем необходимо скомпилировать. –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^