gpt4 book ai didi

java - 是否允许静态类构造函数中的异常转义正确的设计模式?

转载 作者:行者123 更新时间:2023-11-30 06:30:17 24 4
gpt4 key购买 nike

我发现自己经常在以下两种设计模式之间进行选择:

static {
try {
foo();
}
catch(Exception exc) {
throw new RuntimeException(exc.getMessage());
}
}

TheConstructor() throws SomeException {
if(alreadyInited) {
return;
}
alreadyInited = true;
foo();
}

问题是我真的想为每个类初始化一次东西——所以我认为是静态的——比如设置一个记录器,从文件加载一些 map 等等——我真的希望程序在以下情况下停止此操作失败。这两种设计模式看起来都很笨拙(第一种更明显),所以我想知道是否有更好的方法来做到这一点。

最佳答案

Is allowing exceptions in static class constructors to escape a proper design pattern?

我会说不

首先,在该上下文中包装一个已检查的异常意味着如果出现问题,您将遇到类初始化失败。

  • 传播到类初始化器之外的异常无法被直接捕获和处理。

  • 类初始化期间未捕获的异常是不可恢复的。即使您可以捕获并处理异常,该类和(我认为)所有其他依赖它的类/它们也将处于无法初始化的状态,因此无法使用。对于(至少)类加载器,甚至可能整个 JVM,这实际上是“游戏结束”。

更大的图景是,这可能代表对静力学的不当使用。有更好的方法来处理这个问题;例如

  • 使用显式调用(在您可以捕获和处理异常的地方)进行初始化,而不是依赖类初始化。

  • 摆脱静态(可能还有包装它的单例类)并使用依赖注入(inject)。

关于java - 是否允许静态类构造函数中的异常转义正确的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627236/

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