gpt4 book ai didi

Java - 如何选择一个可用路径来加载静态 block 中的文件?

转载 作者:行者123 更新时间:2023-11-29 04:14:43 25 4
gpt4 key购买 nike

我的类中有一个静态 block ,因此当类加载器加载类定义时 - 从这个静态 block 调用一个方法。该方法的目的是从可用路径之一加载配置。我想要使​​用第一个可用路径。

有 2 个配置文件(metrics_config.jsonmetrics_config_new.json),每个都可以位于以下两个路径之一:

private static final File CONFIG_FILE_1 = new File("file:///dest1/config/metrics_config.json");
private static final File CONFIG_FILE_2 = new File("file:///dest2/config/metrics_config.json");

private static final File CONFIG_FILE_3 = new File("file:///dest1/config/metrics_config_new.json");
private static final File CONFIG_FILE_4 = new File("file:///dest2/config/metrics_config_new.json");

如何只传递方法当前可用的一个路径?我想这可能看起来类似于:

static {
// choose 1st file's path
if (CONFIG_FILE_1.exists() && CONFIG_FILE_1.isFile()) {
loadConfiguration(CONFIG_FILE_1);
}
if (CONFIG_FILE_2.exists() && CONFIG_FILE_2.isFile()) {
loadConfiguration(CONFIG_FILE_2);
}
// choose 2nd file's path
if (CONFIG_FILE_3.exists() && CONFIG_FILE_3.isFile()) {
loadConfiguration(CONFIG_FILE_3);
}
if (CONFIG_FILE_4.exists() && CONFIG_FILE_4.isFile()) {
loadConfiguration(CONFIG_FILE_4);
}
}

我当前解决方案的缺点是它将检查第一个文件和第二个文件的两个路径。确定将哪条路径传递给 loadConfiguration 方法的正确方法是什么?

最佳答案

解决办法真的是不做。没有 static code blocks ,或其他类初始化代码,执行由于 IO 等环境问题(使用类加载器除外)而很有可能失败的操作。

还有

  • 在执行此操作时确保良好的错误处理太困难了。 Checked exceptions, include IOException, may not propagate out of them ,这意味着您的 IO 代码中的所有错误处理必须是自包含的。
  • 这使得使用依赖注入(inject)进行单元测试变得非常困难。
  • The order that static blocks in different classes are executed is not obvious and can change if you refactor your code .这使得那些 static block 之间的依赖关系很难得到正确的如果你的代码很复杂。正确地执行 IO 很复杂。
  • static block 在持有锁时执行。如果您的static block 直接或间接 尝试执行任何多线程处理,这可能会导致死锁。例如,通过 using streams .避免此类问题的唯一方法是使 block 中的代码非常简单。正如我之前所说,IO 代码很复杂。它不可避免地涉及以复杂且不明显的方式委托(delegate)给其他类(封装和信息隐藏是一项功能,而不是错误)。您能确定没有封装的代码会导致死锁吗?
  • 而且重要的是,在卸载相应的类加载器之前,静态对象引用不会被垃圾回收。因此,当引用外部资源时,由于可能的内存泄漏造成的影响可能会很严重。

而是将读取的配置文件移动到您的 main 方法中,或者从它调用的方法中。

关于Java - 如何选择一个可用路径来加载静态 block 中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53115156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com