我有一个对象列表(MyObject)。这些对象的一个属性是“类型”字符串值。列表对象用于在线程池中生成线程。如何根据类型不同地处理每个对象,而不为扩展基础对象的每种类型创建新对象?
基本接口可以工作,但是要求我在每个对象类型的不同具体类中实现它们(可以有很多类型)。感觉就像有一种模式可以以干净的方式解决这个问题,但我找不到它......任何人都有任何想法?
以下是我要完成的内容:
List<MyObject> objects = dao.getObjects();
if (objects.size() > 0) {
for (MyObject obj : objects) {
taskExecutor.submit(???);
}
}
答案 0 :(得分:1)
这些对象的一个属性是“类型”字符串值
这是您的错误 - 为您的类型使用enum
并将其用作工厂进行处理。
class MyObject {
Type type;
}
enum Type {
TypeA {
@Override
void process(MyObject o) {
// Stuff.
}
},
TypeB {
@Override
void process(MyObject o) {
// Stuff.
}
};
abstract void process(MyObject o);
}
public void test(MyObject o) {
o.type.process(o);
}
答案 1 :(得分:0)
我可能会犯这个错误(抱歉,如果我这样做了!),但不能是一个简单的地图:
Map<String, Function<YourObject, Callable<V>>> typeToTask = new HashMap<>();
做这个工作?因此,根据每种对象类型,您只需提供一个提交给线程池的闭包(任务)工厂。 Function
可能是
interface Function<I, O>{
O apply(I object);
}
如何添加处理作业:
typeToTask.put("objectType1", new Function<YourObject, Callable<V>>(){
public Callable<V> apply(YourObject yourObject){
return new Callable<V> () {
... do the job for yourObject of type "objectType1" ...
}
}
});
然后你可以迭代列表并提交这样的工作:
for(YourObject yourObject : objects){
executor.submit(typeToTask.get(yourObject.type).apply(yourObject));
}