如何处理引发已检查异常的静态最终字段初始值设定项

2022-08-31 22:07:10

我遇到了一个用例,我想声明一个字段,其中包含一个初始值设定项语句,该语句被声明为引发已检查的异常。通常,它看起来像这样:static final

public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");

我在这里遇到的问题是,构造函数可能会抛出各种检查的异常,我不在乎(因为我知道我的名字是有效的,如果它不幸崩溃了,如果它不是,那也没关系)。Java编译器不会让我忽略这一点(因为它是一个检查的例外),我宁愿不诉诸于:ObjectName

public static final ObjectName OBJECT_NAME;
static {
    try {
        OBJECT_NAME = new ObjectName("foo:type=bar");
    } catch (final Exception ex) {
        throw new RuntimeException("Failed to create ObjectName instance in static block.", ex);
    }
}

因为静态块真的非常非常难以阅读。有没有人对如何以一种漂亮,干净的方式处理这种情况有任何建议?


答案 1

如果你不喜欢静态块(有些人不喜欢),那么另一种方法是使用静态方法。IIRC,Josh Bloch推荐了这个(显然不是在有效的Java中快速检查)。

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar");

private static ObjectName createObjectName(final String name) {
    try {
        return new ObjectName(name);
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

艺术

public static final ObjectName OBJECT_NAME = createObjectName();

private static ObjectName createObjectName() {
    try {
        return new ObjectName("foo:type=bar");
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

(已编辑:更正了第二个示例以从方法返回,而不是分配 .)static


答案 2

您的代码是完全有效的。我不觉得阅读困难。其他方式只会让情况变得更糟。它们只是初学者很难阅读,因为他们中的大多数人都不熟悉这一点。只需遵循有关代码中元素排序的标准约定即可。例如,不要将静态初始值设定项放在代码的中间或整个底部,也不要将多个初始值设定项分布在类中。只需在静态声明之后将一个放在顶部即可。


推荐