【问题标题】:How to resolve abstract static method design issue?如何解决抽象静态方法设计问题?
【发布时间】:2012-01-12 16:45:40
【问题描述】:

我有几个队列都扩展了Queue 类。我想做一个队列管理器基类来处理添加到队列(和其他操作)。

如果您看一下下面的代码,我创建了一个名为QueueManger 的基类,它有一个名为add() 的静态方法,它将获取“队列”并为其添加一个变量。我想让getQueue()(在 add() 中调用)抽象,因为我想强制其他类提供他们自己的“队列”实现。问题是我不能声明抽象静态方法。解决这个问题的正确方法是什么?

public class RegistrationQueueManger {
    @Override
    Queue getQueue() {
        return new RegistrationQueue(); // RegistrationQueue is a class that
                                        // extends Queue.java
    }
}

public abstract class QueueManger {
    abstract static Queue getQueue(); // Error: cant do! (in java)

    public static Add(String myvar) {
        getQueue().add(myvar);
    }
}

注意:我看到了一些关于这个主题的问题,但它并没有真正给出如何解决它并创建另一个设计来处理它的好答案。

【问题讨论】:

  • 阅读下面的答案,并使用单例模式代替您的代码
  • 如果他想扩展QueueManager,它不应该是静态的或单例的。
  • 对,让 RegistrationQueueManger 成为单例怎么样?是吗。

标签: java abstract-class


【解决方案1】:

只有实例方法可以被覆盖。所以对静态方法的抽象是没有意义的。 getQueue 方法不应该是静态的,add 方法也不应该是静态的。

【讨论】:

    【解决方案2】:

    这是因为抽象方法必须被覆盖(实现)并且静态方法不能被继承。任何静态的都属于声明它的类本身。因此,如果您将getQueue() 设为静态,它将是属于QueueManger 类本身的类方法。所以,让它成为一个实例方法,这样每个扩展QueueManger 的类都会有自己的getQueue()

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 2014-03-19
      • 2011-02-25
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多