[英]How to handle a static final field initializer that throws checked exception
我正面临一个用例,我想用声明为抛出已检查异常的初始化语句声明一个static final
字段。 通常,它看起来像这样:
public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");
我在这里遇到的问题是ObjectName
构造函数可能会抛出各种已检查的异常,我并不关心(因为我知道我的名字是有效的,如果它不幸崩溃也没关系,以防万一)。 java编译器不会让我忽略这个(因为它是一个检查异常),我不想诉诸于:
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);
}
}
因为静态块真的非常难以阅读。 有没有人对如何以一种漂亮、干净的方式处理这种情况提出建议?
如果您不喜欢静态块(有些人不喜欢),那么另一种方法是使用静态方法。 IIRC,Josh Bloch 推荐了这个(显然不是在快速检查的 Effective 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
。)
您的代码完全有效。 我觉得读起来不难。 其他方式只会让情况变得更糟。 它们只是初学者难以阅读,因为他们中的大多数人都不熟悉。 只需遵循有关代码中元素排序的标准约定。 例如,不要将静态初始化器放在代码的中间或整个底部,也不要将它们中的多个散布在整个类中。 只需在静态声明之后将一个放在顶部。
static
块不难阅读。 所以我推荐这个解决方案。 但是,您可以将您的对象包装在另一个对象中,例如ObjectNameWrapper
,它与您的ObjectName
共享一个interface
,并且其构造函数调用您的ObjectName
构造函数,隐藏发生的所有已检查异常。 但同样,我会选择静态选项。
您可以使用用 Lombok 的@SneakyThrows
注释的方法
public static final ObjectName OBJECT_NAME = createObjectName();
@SneakyThrows(SomeException.class)
private static ObjectName createObjectName() {
return new ObjectName("foo:type=bar");
}
此注释使受检查的异常表现得像未经检查的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.