Java - 类层次结构,包含不同对象类型的子类,以及从另一个类处理它们

时间:2013-08-26 18:58:25

标签: java generics object types

我会尽量简要介绍问题...

线程池执行链式任务。每个任务都继承自一个抽象类。他们中的大多数都处理外部服务,需要根据服务进行定制。每个任务都将包含一个对象或对象列表,我们将其称为TaskObjects,尽管它们可以是String,Integer,MyClass等。当任务完成时,它会将TaskObject和其他数据放入响应集合中对象并传递它。当任务链完成时,集合将返回到主线程。

主线程将评估响应并根据这些响应确定要采取的操作。这些可能是立即操作(即,拉动TaskObject,操纵它们,并将结果放入新任务以​​便在下一个可用线程上执行),或者可能需要累积该类型的N个响应以触发操作(即,拉动TaskObject,可能操纵它们,并将它们放在本地集合中。如果N个TaskObject(s)在M时间内在该集合中建立,则对这些TaskObject采取动作)。操作也可能基于响应集合中其他任务的响应发生位置,因此响应无法单独处理。

我面临的问题是处理不同的TaskObjects。它们不从任何共享类继承(当然,除了Object)。多态性无济于事。主线程评估的性质使事情复杂化。我正在考虑各种选择,但没有一个看起来非常“好”......

  • 委派任务/响应来处理事物,使用访问者等。 这很困难,因为每项任务都没有意识到任何事情 它自己的行为和下一个任务将是什么。他们必须配合 一些“集中”服务来处理结果,这将有 将线程安全考虑在内,并捆绑所有响应 进入一个集合使事情复杂化。可行,但我可以 交换一个又一个混乱。
  • 泛型。它可能有助于压缩某些层次结构,但事实并非如此 解决主要线程处理TaskObjects的问题 不知道T是什么类型或如何处理它。你好typechecking 条件句。布莱什。
  • 让自己彻底改变对攻击对象的攻击。<​​/ li>
  • 在响应中为TaskObject创建一个包装器 所有类型的字段并将其放在抽象类中。现在我们得到nullcheck一切来找出 我们正在处理什么。没好多了。

我不确定是否有一种“好”的方式来处理这类事情。 Java中的一般问题并不是很独特,但这种特殊的困境可能会更加困难。也许没有干净的方法来处理这个问题,我只需要重构一下并实现最不好的解决方案。

然后,我可能会让事情过于复杂,而且更好的选择就是坐在我的鼻子底下......

1 个答案:

答案 0 :(得分:0)

在您的描述中,在我看来,您有两个可以看到各种任务的地方:任务层次结构本身和主线程中的响应处理。这意味着添加新任务可能需要在这两个地方进行更改,这会降低您的代码的灵活性。

我想知道你是否可以在一个地方封装这个品种。一种想法是使用策略模式:在这种情况下,策略将定义处理逻辑,这取决于整个响应集合。特定的Task类只保留对策略的引用。这还需要使用一种方法ITask创建类似getProcessingStrategy()的界面。在您的情况下,战略界面需要能够适应您复杂的处理方案(例如execute(Collection<IResponse>))。

最终,您将拥有一个任务类层次结构和一些独立的处理策略。每个任务类都将指定要使用的策略。添加新任务类需要决定使用哪种策略来处理任务响应。