在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;
}
}
这两种方法都可以处理继承关系,但第二种方法更为灵活,因为它为每个子类提供了自己的单例实例。