很多搜索都无法帮助我解决我的问题。 在重构大量实现生产者-消费者模式的代码时,我遇到了一个简单组合的问题。
在重构结束时我们有一个非常简单的结构
1) 一个 Spooler 类,用于调度消费者线程。
2) 一个抽象类AbstractConsumer,包含一些真实的方法和变量以及一个抽象方法run();
3) 子类——真正的消费者,它扩展了 AbstractConsumer 并覆盖了 run() 方法。
class Spooler {
private int spoolSize = 100;
private Consumer[] spool = null;
//private ArrayList<? extends Consumer> spool = null;
//...
public Spooler() {
init();
}
public final void init() {
if (spool == null) {
spool = new ArrayList<Consumer>();
for (int i = 0; i < spool.size(); i++) {
spool.add(new Consumer(null, null));
spool[i] = new Consumer();
spool[i].start();
}
}
}
}
public abstract class AbstractConsumer extends Thread {
//some NOT ABSTRACT variables and methods
@Override
public abstract void run();
}
class XmlConsumer extends Consumer {
@Override
public void run() {
//consume current task
}
}
所以,我想要的。当我需要一些多线程数据处理时,我意识到当前的消费者,覆盖抽象父类(super class)的 run() 方法。实现新的 Spooler,其构造函数必须获取 currentConsumer。然后所有它必须工作,我想。
我不知道如何在不实现其抽象方法的情况下将 AbstractConsumer 添加到 Spoolers ArrayList 中。就这样
for (int i = 0; i < spool.size(); i++) {
spool.add(new AbstractConsumer() {
@Override
public void run() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
})
}
我认为,它需要在这里使用 Java 泛型类,我努力尝试,但都失败了。请告诉我如何解决我的问题。谢谢 =)
最佳答案
如果你想让你的假脱机程序是通用的,你应该将它与你注入(inject)假脱机程序构造函数的工厂组合起来
interface ConsummerFactory {
public AbstractConsummer create();
}
因此在后台处理程序的 init
方法中,您调用工厂的 create
方法
然后如果你想要一个 XmlConsumer
的假脱机程序,你只需要实现一个 ConsummerFactory
,它的 create
方法创建一个 XmlConsummer
并将其作为后台处理程序构造函数的参数
关于使用中的 Java 泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33235603/