java - 如何将参数传递给静态初始化 block

标签 java oop file-io singleton utility-method

我想要做的是从一个文件(使用 Apache poi 的 excel 文件)加载键/值对到一个将用作查找表的静态映射中。一旦加载,表格将不会改变。

public final class LookupTable
{  
   private final static Map<String, String> map;  
   static {
     map = new HashMap<String, String>();
     // should do initialization here
     // InputStream is = new FileInputStream(new File("pathToFile"));
     // not sure how to pass pathToFile without hardcoding it?
   }

   private LookupTable() {
   }

  public static void loadTable(InputStream is) {
    // read table from file
    // load it into map
    map.put("regex", "value");
  }

  public static String getValue(String key) {
    return map.get(key);
  }
}

理想情况下,我想在静态初始化 block 中加载 map ,但我如何在不硬编码的情况下传递流?我在使用 loadTable 静态方法时遇到的问题是它可能不会在调用其他静态方法之前被调用。

// LookupTable.loadTable(stream);  
LookupTable.getValue("regex"); // null since map was never populated.

有更好的方法吗?

最佳答案

您使用的任何东西都必须在启动时可以访问。据我所知,您的选择是:

  1. 对路径进行硬编码。由于显而易见的原因,这很糟糕。
  2. 静态变量或静态方法。这有点像先有鸡还是先有蛋的问题;最终它会被硬编码,但至少您可以使用 static 方法进行搜索。
  3. 使用 Java 或环境变量。因此,您将使用 System.getProperty("filename", "/default/filename")。更好,因为它至少可以在 JVM 启动时使用环境或 -D 参数进行自定义。
  4. 使用 ClassLoader getResource* 方法。这可能是正确的答案。具体来说,您可能希望使用 getResourceAsStream()当前线程上下文 ClassLoader 上的方法 Thread.currentThread().getContextClassLoader() . (因此,Thread.currentThread().getContextClassLoader().getResourceAsStream("filename") 总共。)ClassLoader 将为您找到您的资源(只要你把它放在你的 CLASSPATH 中的某个理智的地方)。

关于java - 如何将参数传递给静态初始化 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791259/

相关文章:

c# - 在列表中 - 如何仅调用一次基类中的方法

c# - Windows 上文本文件的事务处理

java - 使用非平凡算法的 tdd

java - 如何在 Google map 上的信息窗口中显示变量

java - 如何最好地将 OOP 原则应用于游戏和其他输入驱动的 GUI 应用程序?

python - 同时读取多个文件的每一行

Matlab:只读 .csv 文件中的标题行

java - Java中初始化一个Vector对象,总是不对

java - 多词搜索栏

java - 重用函数时使用什么模式