我有一个java web应用程序,需要在初始化时(即:当jboss服务器启动时)从外部文件读取信息。
由于读取和解析此文本文件是一项昂贵的操作,因此我们决定仅加载一次,然后将其设置到内存中,以便可以在任何地方访问它(初始化后不需要修改变量)。
我到处都读到应该避免全局变量,那么这种情况的最佳实践是什么?
编辑:我应该提到信息应该存储在一个简单的列表变量中。
最佳答案
这很大程度上取决于您使用的框架。一般来说,你是对的,全局变量通常被视为反模式。但你得明白其中的原因,主要是可测试性。
为了测试“全局”事物,您通常使用工厂、Provider 等模式,通常与依赖注入(inject)(例如 Spring、Guide)结合使用。
最后你正在缓存。对于缓存,您还可以使用一些框架,例如 EHCache。但也许这对你来说开销太大了。
为了保持简单和简单的Java,我建议这样的东西(只是初稿,未经测试):
public class FileCache {
Map<String, String> fileContents = new HashMap<String, String>();
public void loadFile(String path) {
if (fileContents.contains(path)) {
return fileContents.get(path);
}
// Loading logic
String content = loadContentOfFile(path);
fileContents.put(path, content);
return content;
}
}
通过这个,您可以保持缓存的可扩展性(您可以缓存任意数量的文件),并且可以轻松测试此类。但最终您会遇到一些需要访问此类的全局位置。
然后你要么有依赖注入(inject),一个静态变量或一些单例。 对于单例,您应该注意保持简单,因为它又很难测试。
public class FileContentProvider {
private static FileContentProvider instance;
private final FileCache fileCache = new FileCache();
public static FileContentProvider getInstance() {
if (instance == null) {
instance = new FileContentProvider();
}
return instance;
}
public FileCache getFileCache() {
return fileCache;
}
}
关于java - 在初始化中加载变量的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535856/