在Java中,getInstance()
方法通常用于获取类的单例实例。当涉及到继承时,我们需要确保子类也能正确地获取到父类的单例实例。为了实现这个功能,我们可以使用以下方法:
- 使用
protected
访问修饰符:将getInstance()
方法声明为protected
,这样子类可以访问该方法,但其他类无法直接访问。这样,子类可以覆盖getInstance()
方法,以便在返回单例实例时返回子类的实例。
public class Parent { private static Parent instance; protected static Parent getInstance() { if (instance == null) { instance = new Parent(); } return instance; } } public class Child extends Parent { private static Child instance; @Override protected static Child getInstance() { if (instance == null) { instance = new Child(); } return instance; } }
- 使用
static
内部类:这种方法可以确保每个子类都有自己的单例实例,同时仍然可以使用父类的单例方法。这是通过使用内部类实现的,当外部类被加载时,内部类不会被加载。因此,当我们调用getInstance()
方法时,只有当内部类被调用时,它才会被加载并创建实例。
public class Parent { private Parent() {} private static class ParentHolder { private static final Parent INSTANCE = new Parent(); } public static Parent getInstance() { return ParentHolder.INSTANCE; } } public class Child extends Parent { private Child() {} private static class ChildHolder { private static final Child INSTANCE = new Child(); } public static Child getInstance() { return ChildHolder.INSTANCE; } }
这两种方法都可以处理继承关系,但第二种方法更为灵活,因为它为每个子类提供了自己的单例实例。