0

假设你有一个抛出一些异常A的单例。getInstance()

进一步假设A在整个程序中到处都在使用它,虽然A.getInstance().doSomethingUseful()很好,但很多代码都从Constants接口继承,我想声明:

A a = A.getInstance()Constants,允许每个人都Constants可以访问a.

但是,正如预期的那样,Java抱怨方法抛出异常,因此不能在接口中声明。

有解决方法吗?

4

2 回答 2

3

我认为这真的不是一个好主意。您试图将该对象的生命周期直接绑定到实现该接口的类的结构中。

如果您必须使用单例,那么最好通过该getInstance()方法显式引用它。它相对直观。如果必须,使您的实例化异常运行时。

更好的是接受单例模式被视为反模式的前提,并考虑诸如控制注入之类的替代方案。

于 2012-12-11T16:00:41.133 回答
1

只需将已检查的异常转换为未检查的异常

static A getInstanceA2() throws Error
{
    try
    {   return A.getInstance();   }
    catch(Exception e)
    {   throw new Error(e);   }
}

interface Constants
{
    A a = getInstanceA2();
}

如果getInstane()失败,界面Constants将被破坏,您的应用程序可能会崩溃。

A如果和之间存在循环依赖ContantsA可能会观察到一些未初始化的静态字段Constants

于 2012-12-11T16:09:34.113 回答