在我的代码中,我必须使用一些常量值,所以我创建了一个实用程序类
div[ui-view].ng-enter {
/*...ENTER-STYLES*/
}
div[ui-view].ng-enter-active {
/*...ENTER-ACTIVE-STYLES*/
}
但我喜欢2000个恒定值,我不会在我的应用程序中使用所有这些值,但它们应该作为选择。问题是当我使用实用程序类时,所有变量都是静态变量,所有字符串值都加载到jvm。
2000常数分为6类。我尝试使用6个静态类,但仍然是相同的。当jvm找到一个静态类时,它会将每个静态变量加载到内存中。
与字符串常量内存相比,我真正使用的所有常量内存,我不会使用它加载到jvm中的内存要大得多。
问题:如何在所有这些常量中仅将单个常量加载到内存中。
答案 0 :(得分:3)
只是为了确定:你问这个是因为你正在做一些“嵌入式”项目;而你遇到了记忆问题;并且您进行了分析/分析,并发现在您的应用程序中使用这些2000字符串是一个问题吗?因为:如果你没有做到这一点 - 是什么让你认为你实际上有一个问题需要你花时间在它上面?
并且附注:仅有的事实是你有2000个常数;其中许多“未使用”...非常表明你应该更少担心这种设计对内存消耗的影响;但在设计本身。
老实说,这首先在“可能不是一个非常好的设计”方面闻起来很糟糕。
答案 1 :(得分:2)
您可以创建属性文件。这些是简单的文本文件,您可以在其中存储键值对并使用标准Java类对其进行解析:Properties
然后您只能加载所需的文件。你说你把你的价值分为6类。您可以创建6个文件,并在需要时只加载您需要的文件。
答案 2 :(得分:1)
这是经常看到的做法。
正如你所提到的那样,可以通过定义类/接口/枚举的几个常量来缓解这个问题。
存在替代品(在某种程度上)。 JAXB允许在XML和Java对象之间进行编组。
@XmlAttribute("surname")
public String surname; // <... surname="...">
上面的注释可以删除,因为该字段具有确切的名称。 顺便说一句:不要为注释值引入常量,因为可以处理注释。
这显示了两种引入常量的方法,我添加了枚举:
enum Category1 { name1, name2 }
不可否认,它必须适合用例。
业务逻辑似乎是最大的问题:许多小域和特定于案例的代码来处理业务规则。域值可以从数据库生成为枚举(反之亦然)。
答案 3 :(得分:-2)
基本上,在加载类时,JVM会加载所有静态变量并将其保存到内存中。如果您只想按需加载常量。您必须使用系统命令编写某些逻辑并从Java代码调用。或者将所有常量移动到文件中,并在需要时检索所需的常量。但是表现明智并不是那么好。