java如果初始化对象涉及检查异常处理,如何使用enum创建单例
编辑
请注意,如果有任何最佳实践,我的问题更容易理解。我描述的问题可以通过多种方式解决,事实上,我是通过抛出运行时异常来处理它的。但这是最佳实践吗?或者我们应该回到更传统的单例创建方式,使用静态方法并将异常与对象创建分离
我正在使用enum来实例化一个单例,正如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?
我找不到任何结论性的答案。所以我的问题是:这方面的最佳实践是什么?抛出断言错误是唯一的出路吗
谢谢你的帮助
编辑
我的“MailApp”只有在我们有有效的电子邮件服务时才有效。简而言之,我不想创建一个空对象。你能解释一下为什么这可能是个坏主意,以及应该如何处理这个问题吗
# 1 楼答案
复杂的例子:
编辑:
基本的
# 2 楼答案
实际上,我不同意这种方法,特别是因为你正在处理的问题
如果必须在SE环境中实现单件,我会如下所示:
如果我必须的话,我之所以强调,是因为我一开始就试图避免它,因为我很少只会有其中一种。使用CDI或Picocontainer进行依赖注入的概念也适用于SE环境,尽管CDI与Picocontainer相比有很多麻烦,诊断起来也更混乱
在JEE6环境中,我会使用
@javax.ejb.Singleton
注释。这保证了集群部署中只有一个实例,不会有太多麻烦为了阐明上述方法的作用:
enum
是Serializable
但是不能保证你的单例类是可序列化的李>class
,而不是一个enum
。这类似于在interface
中使用常量,这在有效的Java书籍https://softwareengineering.stackexchange.com/questions/49572/is-it-a-bad-practice-to-have-an-interface-to-define-constants中被认为是一个坏主意RuntimeException
和Error
,比如OutOfMemoryError
,因为它会自动将错误包装在ExceptionInInitializerError
中,这使得错误更明显李>