【问题标题】:Java - Class hierarchy, child classes containing different object types, and handling them from another classJava - 类层次结构,包含不同对象类型的子类,并从另一个类处理它们
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      相关资源
      最近更新 更多