我有一个java Web应用程序,需要在初始化时从外部文件中读取信息(即:启动jboss服务器时)。
由于读取和解析此文本文件是一项昂贵的操作,我们决定只加载一次,然后将其设置为内存,以便可以在任何地方访问(变量在初始化后不需要修改)
我到处都读过应该避免全局变量,那么这种情况的最佳做法是什么?
编辑:我应该提到信息应该存储在一个简单的List变量中。
答案 0 :(得分:2)
它在很大程度上取决于您使用的框架。一般来说,你是对的,全局变量通常被视为反模式。但你必须了解原因,主要是可测试性。
要测试“全局”内容,通常会使用像Factories,Provider这样的模式,通常与依赖注入相结合(例如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;
}
}
通过这种方式,您可以保持缓存的可扩展性(您可以根据需要缓存任意数量的文件),并且可以轻松地测试此类。但最终你会得到一些你需要访问这个课程的全球性地方。
然后你要么有依赖注入,一个静态变量或一些Singleton。 对于单身人士,你应该保持简单,因为它再次难以测试。
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;
}
}
答案 1 :(得分:1)
全局可访问的静态配置对象非常常见。您可以使用Singleton-Pattern访问Config。这看起来像这样:
public class Config {
private static Config myInstance;
private Config() {
// Load the properties
}
public static getInstance() {
if (myInstance == null) {
myInstance = new Config();
}
return myInstance;
}
public String getConfigPropertyBla()
...
}
如果你使用Spring,你可以让Spring将属性加载到Bean。然后,您可以通过应用程序中的任何位置自动装配来访问Bean。我个人认为,这是一个非常好的解决方案。
答案 2 :(得分:0)
DI,IoC容器。看看Guice,非常好看。