关于java:如何继承单例

您所在的位置:网站首页 java单例类 关于java:如何继承单例

关于java:如何继承单例

#关于java:如何继承单例 | 来源: 网络整理| 查看: 265

有时需要继承单例,但是因为在单例中,您使用的静态引用和静态方法不能被覆盖。

例如(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