java - 如果初始化对象涉及检查异常处理,如何使用枚举创建单例

标签 java constructor enums

编辑

请注意,我的问题更多是为了了解是否有任何最佳实践。我描述的问题可以通过多种方式解决,事实上我是通过抛出运行时异常来处理它的。但这是最佳实践吗?或者我们应该回到更传统的单例创建方式,使用静态方法并将异常与对象创建解耦

我正在按照《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/

相关文章:

java - 在两个 Override 方法之间传递对象

javascript - 为什么我的 HTML 构造函数对象返回 [object Object] 而不是 [HTMLElementElement]?

java - println : Location class, 方法 println() 出错

typescript - 使用枚举上的自定义错误消息处理 Zod 错误

java - 如何在 Tomcat 6 中配置 SQLite?

java - JPA:如何保存具有一对一关系的两个实体?

java - System.out 是缓冲的还是非缓冲的?

c++ - SFINAE:启用类构造函数

c# - 在 C# 中将超出范围的数字转换为枚举不会产生异常

java - 使用枚举静态变量创建了多少个副本