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更好,因为您不需要单例本身,而是有碰巧只有一个实例的类。当您需要模拟该类或稍后决定需要两个实例时,不需要对代码进行任何更改。我尽量只使用通过枚举定义的无状态单例。