Singleton + Abstract类问题

时间:2015-02-06 18:02:19

标签: java oop design-patterns

我正在尝试定义此继承:

public abstract class GameAction extends Observable {
  protected static GameAction instance = null;

  protected GameAction() {
    // Exists only to defeat instantiation.
  }

  //All GameActions are singletons
  public static abstract GameAction getInstance();
}

public class ChooseAnswerAction extends GameAction {

  protected ChooseAnswerAction() {
    // Exists only to defeat instantiation.
  }

  //All GameActions are singletons
  @Override
  public static GameAction getInstance() {
    if(instance == null) {
      instance = new ChooseAnswerAction();
    }
    return instance;
  }
}

问题是第二个类中的getInstance()方法在他父亲身上找不到相同的方法,因此它要求我删除@Override

同样在父类上,我收到以下错误:

  

GameAction类型中的抽象方法getInstance只能设置一个可见性修饰符,一个是公共的或受保护的

我能解决这个错误的唯一方法是取出静态修饰符,但我需要它......

感谢你的时间!

2 个答案:

答案 0 :(得分:2)

以下是关于单身人士的链接。自从AlekseyShipilёv发表了非常详细的帖子 - 我将你链接到那里。

http://shipilev.net/blog/2014/safe-public-construction/

在您的情况下,由于您要返回子单例实例,我建议实例对象在子类中。此外,您可能需要更好的设计并考虑使用单件工厂。

答案 1 :(得分:0)

简短的回答是,你不能覆盖静态方法,因为它们绑定到超类。

答案很长,这使得实现单例继承变得复杂(假设您希望将实例保存在超类中)。见singleton and inheritance in Java