Java 从接口访问对单例的引用,可以吗?

Java 从接口访问对单例的引用,可以吗?,java,interface,singleton,Java,Interface,Singleton,假设您有一个单例a,其getInstance()抛出一些异常 进一步假设A在整个程序中无处不在,虽然A.getInstance().dosomethingusseve()很好,但许多代码继承自常量接口,我想声明: A=A.getInstance()中的Constants,允许实现常量的每个人访问A 不过正如所料,Java抱怨该方法抛出异常,因此不能在接口中声明 有解决办法吗?我认为这真的不是一个好主意。您正试图将该对象的生命周期直接绑定到实现该接口的类的结构中 如果必须使用单例,那么最好通过ge

假设您有一个单例
a
,其
getInstance()
抛出一些异常

进一步假设
A
在整个程序中无处不在,虽然
A.getInstance().dosomethingusseve()
很好,但许多代码继承自
常量
接口,我想声明:

A=A.getInstance()
中的
Constants
,允许实现
常量的每个人访问
A

不过正如所料,
Java
抱怨该方法抛出异常,因此不能在接口中声明


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

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


最好还是接受单一模式被视为一个前提,并考虑其他选择,例如:

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

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


更好的是接受单模式被视为ANN的前提,并考虑诸如.< /P> < P>等选项,只需将检查异常转换为未选中的

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

interface Constants
{
    A a = getInstanceA2();
}
如果
getInstane()
失败,接口
常量
将被破坏,您的应用程序可能会崩溃


如果
A
Contants
之间存在循环依赖关系,
A
可能会在
常量中观察到一些未初始化的静态字段

只需将选中的异常转换为未选中

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

interface Constants
{
    A a = getInstanceA2();
}
如果
getInstane()
失败,接口
常量
将被破坏,您的应用程序可能会崩溃


如果
A
Contants
之间存在循环依赖关系,
A
可能会在
常量中观察到一些未初始化的静态字段

如果抛出异常,您希望发生什么?(理想情况下,去掉这个“实现常量”部分……阅读有效Java了解详细信息。)接口中的静态方法?:|@amit-我的理解是,java 8允许接口中的静态方法,但是它们不能被继承:),所以这对这里的情况没有帮助。@JonSkeet,我有一本书,我应该重温哪一部分?如果抛出异常,你希望发生什么?(理想情况下,去掉这个“实现常量”部分……阅读有效Java了解详细信息。)接口中的静态方法?:|@amit-我的理解是,java 8允许接口中的静态方法,但是它们不能被继承:),所以这对这里的情况没有帮助。@JonSkeet,我有这本书,我应该重温哪一部分?+1 IOC更好,因为你不需要单例,相反,你有碰巧只有一个实例的类。当您需要模拟该类或稍后决定需要两个实例时,不需要对代码进行任何更改。IMHO,我尝试只使用通过枚举定义的无状态单例。+1 IOC更好,因为您不需要单例本身,而是有碰巧只有一个实例的类。当您需要模拟该类或稍后决定需要两个实例时,不需要对代码进行任何更改。我尽量只使用通过枚举定义的无状态单例。