关于java:如何继承单例 |
您所在的位置:网站首页 › java单例类 › 关于java:如何继承单例 |
有时需要继承单例,但是因为在单例中,您使用的静态引用和静态方法不能被覆盖。 例如(Java): 123456789public class Singleton { private static Singleton instance = null; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }如果我要通过" SingletonChild"类继承" Singleton",则无法通过调用getInstance()方法生成实例。 如果我将创建另一个getInstanceChild()方法,则还将公开基本方法:getInstance()。 相关讨论 真正的单例通常需要具有private构造函数。 您将无法扩展该课程。 单例还导致解决更多问题,这就是为什么在大多数情况下单例都将其视为反模式。 看到这篇文章。 向其添加继承会使其恶化恕我直言。 单例的想法是系统中只有一个。 从类继承时,您的对象仍然是父类的实例(多态)。 因此,它的第二种情况将违反单例合同。 也许您应该考虑自己真正需要的,而不是单例。 考虑一下:您正在编写一些具有某些全局功能(单例)的库,应根据目标用途对其进行扩展。 相关问题:stackoverflow.com/q/23170221/1168342您可以使用Adapter模式,并用另一个Object包裹单例。 如果您还具有Singleton和Adapter共享一个接口,则调用代码不必知道要传递哪个接口。 123456789101112131415161718192021222324252627282930interface MyInterface{ String foo(); void bar(); } public class Singleton implements MyInterface{ //..same as before } public class Adapter implements MyInterface{ private MyInterface delegate; public Adapter(MyInterface adaptMe){ //check for null in real code this.delegate = adaptMe; } //delegate to bar public void bar(){ delegate.bar(); } //override foo public String foo(){ return"AdaptedFoo"; } }然后您的代码可以包装Singleton 1MyInterface myInterface = new Adapter(Singleton.getInstance()); 相关讨论 这确实是正确的解决方案,但是在这种解决方案中,您将必须实现并支持基类中的每个方法,这并不是很方便。 是的,那是真的。 您可以使用Java进行一些技巧,以使用反射来委托调用,请参见动态代理上的Oracle教程docs.oracle.com/javase/8/docs/technotes/guides/reflection/一种方法是使用分离的工厂,该工厂将是此类的创建者,并确保它们确实是单身。 但是此解决方案存在一个不同的问题,工厂必须了解使用基本'Singleton'的类的每个实现,或者必须扩展该工厂才能获得此类知识。 有另一种方法可以解决此问题,使您可以通过新的实现继承单例,而无需修改工厂。 123456789101112131415161718192021222324252627282930313233343536373839404142434445public abstract class SingletonInheritance { public static abstract class AbstractSingleton { private static AbstractSingleton instance = null; protected AbstractSingleton() { } public static |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |