编辑
请注意,我的问题更多是为了了解是否有任何最佳实践。我描述的问题可以通过多种方式解决,事实上我是通过抛出运行时异常来处理它的。但这是最佳实践吗?或者我们应该回到更传统的单例创建方式,使用静态方法并将异常与对象创建解耦
我正在按照《Effective Java》中的规定使用枚举来实例化单例
public enum MailApp {
INSTANCE;
private Gmail mailService;
private MailApp() {
try {
mailService = GoogleMailAppFactory.getGmailService();
} catch (IOException e) {
throw new AssertionError(e);
}
}
问题是如果我添加如下所示的抛出
public enum MailApp {
INSTANCE;
/** Application name. */
private Gmail mailService;
private MailApp() throws IOException {
mailService = GoogleMailAppFactory.getGmailService();
}
这不会编译说未处理的异常
我看过How to throw an exception from an enum constructor?
我找不到任何结论性的答案。所以我的问题是:对此的最佳实践是什么?抛出 AssertionError 是唯一的出路吗?
感谢您的帮助
编辑
只有当我们拥有有效的电子邮件服务时,我的“MailApp”才有效。简而言之,我不想创建一个空对象。您能否解释一下为什么这可能是一个坏主意以及应该如何解决这个问题?
最佳答案
您可能需要考虑将 ioException 作为 RuntimeException 重新抛出。
关于java - 如果初始化对象涉及检查异常处理,如何使用枚举创建单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31180481/