初始化中加载的变量的最佳实践是什么?

时间:2014-08-27 19:53:23

标签: java

我有一个java Web应用程序,需要在初始化时从外部文件中读取信息(即:启动jboss服务器时)。

由于读取和解析此文本文件是一项昂贵的操作,我们决定只加载一次,然后将其设置为内存,以便可以在任何地方访问(变量在初始化后不需要修改)

我到处都读过应该避免全局变量,那么这种情况的最佳做法是什么?

编辑:我应该提到信息应该存储在一个简单的List变量中。

3 个答案:

答案 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,非常好看。