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

标签 java

我有一个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/

相关文章:

java - 添加 androidx.room :room-compiler:2. 1.0-alpha05 后项目未编译

java - 当我尝试使用此 Ant 脚本进行编译时,为什么会出现这些错误?

Java 套接字 : No buffer space available (maximum connections reached? )

java - 如何迭代列表并使用流检查枚举值

java - 解码正则表达式

java - ORMLite 外国 Collection

java - 是否可以更改 Java Swing jList 中项目的名称*显示*?

java - 为什么不建议使用简单的 getter setter 将对象传递给 fragment

java - 如何使实体中的列不可读取

java - 在 Java 中从 int 转换为 short 是多么昂贵