好,所以这是一个普遍的问题...在我的GAE应用程序中我需要保留2种类型的静态数据,参数可能会改变,如用户名和密码(对于外部服务而不是我的用户数据库)所以最好方法不是对它们进行硬编码并将它们保存在数据存储区中,以便我可以从管理系统设置面板更改它们。然而,那些永远不会改变的东西,如表格中选择者的国家列表。以下是我的选择:
选项1:
将它们保存在dataUitls实体下的数据存储区中。但是,这会对我的数据存储报价产生影响。
选项2:
在课堂上硬编码。这不会影响我的数据存储引用,并且在JSP循环中将更快地服务,因为我不必等待数据存储区事务,但是,这将显着影响我的内存和实例。示例如下
package system.Tools;
import java.util.ArrayList;
import java.util.List;
public class SystemConstants
{
public static String[] tmp = {"String1","String2"};
public static List<String>Countries = get(tmp);
private static List<String> get(String[]countries)
{
List<String>result = new ArrayList<String>();
for(String tmp:countries)
{
result.add(tmp);
}
return result;
}
// getters and setters for whatever other parameters I have here
}
两者都可以毫无疑问地运作,但我需要一个专业的意见(最好有人试过这两种意见)告诉我哪种情况对于这种特殊情况更好。
非常感谢!让他们来吧!!
答案 0 :(得分:1)
硬编码常量的处理器开销远低于数据存储区查询,并且使用的内存也更少。数据存储区访问类和对象的内存开销将超过相当大量的硬编码常量。
在极端情况下,数据存储可能具有的唯一可能优势是,当您只需要一小部分大量数据时,内存使用量会略微减少。一份国家名单并不是那么极端。
最佳选择取决于具体情况。而不是推测,衡量和比较。
答案 1 :(得分:1)
这取决于您的要求。如果您认为您的数据永远不会改变,那么硬编码就没有障碍。每当您想要添加多语言支持时,由于硬编码,您最终可能会进行大量更改。
不要只关注静态变量的记忆用法。与你程序中的其他记忆用法相比,它可以忽略不计。
还有第三种方法可以使用。 将这些文件写入.property文件并将其与您的程序捆绑在一起。在启动时你读取文件并加载值。
总结一下,不要想太多记忆。如果列表在数据库中,则必须在使用前将其加载到内存中。如果可以通过GUI更改数据库解决方案,那么它就很好。基于属性文件的方法是高效且易于编程的。
答案 2 :(得分:1)
您有一些选择,具体取决于案例和数据:
Harcode:如果数据根本没有变化且结构很容易而且没有增长(越来越多......),那就没关系。
属性文件:如果您的数据从一个环境更改为另一个环境,则可以为您提供获取文件中数据的优势。将文件从一个环境更改为另一个环境很容易,而不是重新编译。
Json或类似的:如果数据结构可以更改(新属性)或者它是“复杂的”,那么让json中的所有内容更容易管理。如果您有DTO /类,则使用Jackson或类似的解析它是一个或代码行。维护比硬编码数据更好。
数据库:如果数据没有变化,“静态”放入数据库并没有给你带来任何好处,IMO。
当然,无论你决定什么,你都可以解析/读取服务器的启动并将数据写入内存或memcached。