Зареждане на една единствена константа в 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, е много по-голяма.

Въпрос: Как мога да заредя само една константа в паметта сред всички тези константи.


person Sudheer    schedule 28.06.2016    source източник
comment
Ако наистина изглеждат така, няма нужда от нито един от тях. Просто ги изчислете според нуждите си   -  person user207421    schedule 28.06.2016
comment
@EJP Не разбирам какво се опитваш да кажеш. Предлагате ли да използвате статичните променливи.   -  person Sudheer    schedule 28.06.2016
comment
Не е необходимо да съхранявате 2000 низа във формата "/category"+i+"/name"+j. Можете да изчислите тези, от които се нуждаете по време на изпълнение.   -  person user207421    schedule 28.06.2016
comment
Не съм сигурен дали трябва да се притеснявате за производителността, освен ако наистина имате проблем с производителността. В система на производствено ниво 2000 константи не е много лошо. Освен това публичните статични крайни низове са времеви константи за компилиране, те биха ускорили значително приложението ви.   -  person TheLostMind    schedule 28.06.2016
comment
Ако този пример не е реален, не е ясно какво питате, но ако има някакво правило за това как са изградени, можете просто да приложите правилото.   -  person user207421    schedule 28.06.2016
comment
Категорията @EJP е нещо като приложение, аудио,... не категория 1, 2.. същото важи и за имената. Дадох това само за пример.   -  person Sudheer    schedule 28.06.2016
comment
@TheLostMind прав си, по-скоро е проблем с паметта, но кодът ще се използва за webapp, така че няма да е проблем. Но го чувствам като много лош дизайн.   -  person Sudheer    schedule 28.06.2016
comment
@Sudheer - Е, 2K струни наистина са не толкова добър дизайн. Можете да ги генерирате динамично, както казва EJP.   -  person TheLostMind    schedule 28.06.2016
comment
@EJP,@TheLostMind - какво ще кажете за enums. ако използвам enum, може ли това да свърши някаква работа.   -  person Sudheer    schedule 28.06.2016
comment
Трябва да предоставите някои конкретни примери, но като начало бих нормализирал това. Имате само шест категории, например, така че не е необходимо да разбивате всички възможни комбинации от категории и имена. Сериозно все още бих обмислил да нямам нито една от тези константи изобщо и да оставя обединяването на низове да работи по своята магия.   -  person user207421    schedule 28.06.2016


Отговори (4)


И само за да сте сигурни: вие питате това, защото правите някакъв "вграден тип" проект; и сте се натъкнали на проблеми с паметта; и направихте профилиране/анализ и открихте, че наличието на тези 2000 низа всъщност е проблем във вашето приложение? Защото: ако не сте направили нищо от това - какво ви кара да мислите, че всъщност имате проблем, който изисква да отделите време за него?

И странична бележка: само фактът, че имате 2000 константи; много от тях "неизползвани" ... много означава, че трябва да се притеснявате по-малко за ефектите на такъв дизайн върху потреблението на памет; но върху самия дизайн.

Честно казано, това мирише лошо от гледна точка на "вероятно не много добър дизайн" на първо място.

person GhostCat    schedule 28.06.2016
comment
Съгласен съм с Jagermeister, @Sudheer, Вие очаквате машина да прави .5, която разбира само 0 или 1 - person Gaurava Agarwal; 28.06.2016
comment
@Sudheer, това, което имам предвид, е, че JVM или няма да зареди нищо, означава 0, или всички константи, което означава 1. Не може да свърши половин работа. Използването на константи има своите плюсове и минуси. Един от недостатъците, който не се отчита често, е проблемът, пред който сте изправени. Трябва да преструктурирате начина, по който се дефинират константите. Така че една група константи са дефинирани в един клас. Ако използването на паметта е основна грижа, тогава групирайте константи въз основа на функционалност, а не на базата на цялото приложение. - person Gaurava Agarwal; 28.06.2016

Можете да създадете файлове със свойства. Това са прости текстови файлове, където можете да съхранявате двойки ключ-стойност и да ги анализирате чрез стандартни класове на Java: Свойства

След това можете да заредите само файловете, от които се нуждаете. Казахте, че сте разделили ценностите си на 6 категории. Можете да създадете 6 файла и да заредите само един файл, от който се нуждаете, когато имате нужда от него.

person sotix    schedule 28.06.2016

Това е практика, която човек вижда често.

  • В екип причинява ненужни цикли/сливания на контрол на версиите.
  • Компилаторът в използващ източник ще импортира константата в самия клас, а в .class вече няма да пребивава импортирането на класа на константите. Така че, ако константа получи друга стойност, остаряла стойност остава в използващия клас (необходимо е ръчно почистване+изграждане).
  • Новият код е разделен на две места, което не се "тече" възможно най-бързо, също за търсене и четене.

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

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

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

Горната анотация може да бъде премахната, тъй като полето има точното име. Между другото: не въвеждайте константи за стойности на анотации, тъй като анотациите могат да бъдат обработени.

Това показва два начина за въвеждане на константи и добавям enum:

  • чрез анотация - обработва се в java
  • по размисъл (все пак неефективно)
  • по enum: enum Category1 { name1, name2 }

Вярно е, че трябва да отговаря на случая на употреба.

Бизнес логиката изглежда най-големият проблем: много малки домейни и специфичен код за обработка на бизнес правила. Стойностите на домейна могат да бъдат генерирани като enum от базата данни (или обратното).

person Joop Eggen    schedule 28.06.2016
comment
Как се генерира enum от базата данни? Екземплярите на enum са предварително определени по време на компилиране, нали? - person Basil Bourque; 28.06.2016
comment
@BasilBourque Съжалявам, имах предвид, че човек може да генерира за DB таблици с SQL enums или стойностни редове java източници, които след това трябва да бъдат компилирани. - person Joop Eggen; 28.06.2016
comment
Предлагам ви да разширите това във вашия отговор. Мисля, че говорите за програмно генериране на текста за изходния код на Java, който след това да бъде компилиран в приложението, но не съм сигурен. - person Basil Bourque; 28.06.2016
comment
Да, малко приложение, което прави запитвания към базата данни и генерира java enum или подобно. Много зависи какви константи, така че ще се въздържа да пиша нещо. Започнете да пишете такъв инструмент, когато сте направили такъв клас на ръка, и в бъдеще се очакват повече стойности. Поставете всички тези генерирани източници в отделен библиотечен проект за версии. - person Joop Eggen; 28.06.2016

По принцип, докато зарежда клас, JVM зарежда всички статични променливи и ги държи в паметта. Ако искате да заредите само константите при поискване. Трябва да напишете определена логика, като използвате системни команди и да извикате от Java код. Или преместете всички константи във файл и извличайте необходимите константи, когато е необходимо. Но производителността не е толкова добра.

person JP Bose    schedule 28.06.2016
comment
Да, преместете вашата константа във файл и изпълнете командата 'grep' с името на вашата константа и заредете резултата в java променлива. - person JP Bose; 28.06.2016
comment
@JPBose - Не, това не е правилният начин да се правят нещата. Това всъщност е ужасен начин както по отношение на дизайн, така и на производителност. - person TheLostMind; 28.06.2016
comment
@TheLostMind е прав, не искам да използвам статично за този проблем, защото това би било лош дизайн и извикването на собствен код от Java код е излишно за производителност. - person Sudheer; 28.06.2016