强制消耗队列

时间:2016-02-20 12:35:36

标签: java design-patterns

目前我有一种消耗队列事件的方法。根据类型我调用适当的方法来处理它。

private void consumeQueue() {
    MyQueue myQueue = MyQueue.getInstance();
    Iterator mIterator = myQueue.iterator();
    while (mIterator.hasNext()) {

        Object mEvent = null;
        try {
            mEvent = mIterator.next();
            mIterator.remove();
        } catch (NoSuchElementException e) {
            return;
        }

        if (mEvent instanceof EventOne)
            handleOne((EventOne) mEvent);
        else if (mEvent instanceof EventTwo)
            handleTwo((EventTwo) mEvent);
        ...
    }
}

让我们假设开发人员在其他地方排队了一种新类型的事件,我们称之为EventThree。以这种方式这样做我不能确定开发人员是否会正确处理EventThree的消费。

是否有任何模式,所以我可以强制(在编译时)开发人员,以处理EventThree的消费?

1 个答案:

答案 0 :(得分:0)

据我所知,您的MyQueue类实现了Queue interfance。您不应该在代码中使用raw types。考虑将MyQueue用作具有某种类型参数的泛型类:

MyQueue<EventOne> myQueue = MyQueue.getInstance();

你还必须改变getInstance()方法。优雅的解决方案可能如下所示:

<T> MyQueue<T> getInstance(Class<T> clazz) {
    if (clazz == EventOne.class) {
        // ...
    } else if (clazz == EventTwo.class) {
        // ...
    }
}

P.S。遗憾的是,由于Java type erasure,您无法使用不同的getInstance()类型参数定义两个Queue方法。