【发布时间】:2013-08-29 08:27:45
【问题描述】:
我会尽量简短地描述问题...
线程池执行链式任务。每个任务都继承自一个抽象类。它们中的大多数处理外部服务,需要定制以与服务对话。每个任务将包含一个对象或对象列表,我们将其称为 TaskObjects,尽管它们可以是 String、Integer、MyClass 等。当任务完成时,它会将 TaskObject(s) 和其他数据放入响应集合中对象并将其传递。当任务链完成后,集合返回到主线程。
主线程将评估响应并根据这些响应确定要采取的操作。这些可能是即时操作(即,拉出 TaskObject,操作它们,并将结果放入新任务中以便在下一个可用线程上执行),或者可能需要累积 N 个该类型的响应来触发操作(即,拉出TaskObject(s),可能对其进行操作,并将它们放置在本地集合中。如果N个TaskObject(s)在该集合中建立超过M时间,则对那些TaskObject(s)采取行动)。操作也可能基于响应发生的位置与响应集合中的其他任务相关,因此响应无法单独处理自己。
我面临的问题是处理一堆不同的任务对象。它们不继承自任何共享类(当然,Object 除外)。多态性无济于事。主线程评估的性质使事情变得复杂。我正在寻找选项,但它们似乎都不是很“好”...
- 委派任务/响应来处理事情、使用访客等。 这将是困难的,因为每项任务都不知道超出的任何内容 它自己的所作所为以及下一个任务将是什么。他们必须配合 到一些“集中”的服务来处理结果,这将有 考虑线程安全,并捆绑所有响应 成一个集合使事情复杂化。可行,但我可能只是 以乱换乱。
- 泛型。它可以帮助扁平化一些层次结构,但它不会 解决主线程处理TaskObjects的问题 不知道 T 是什么类型或如何处理它。你好类型检查 条件。布莱赫。
- 让我自己彻底检查响应对象。
- 在响应中为 TaskObject(s) 创建一个包装器 所有类型的字段并将其放在抽象类中。现在我们可以对所有内容进行空检查以找出答案 我们正在处理的事情。也好不了多少。
我不确定是否有处理这类事情的“好”方法。一般问题在 Java 中并不是很独特,但这种特殊的困境可能更是如此。也许没有干净的方法来处理这个问题,我只需要重构一点并实施最不坏的解决方案。
再说一次,我可能会让事情变得过于复杂,而更好的选择是坐在我的鼻子底下......
【问题讨论】:
标签: java generics object types