循环依赖,递归类

时间:2014-08-26 21:41:50

标签: java javafx java-8 javafx-8 circular-dependency

我有一个基类PlanItem,所有其他子类都可以扩展。

  • 目标扩展了PlanItem。
  • 策略扩展了PlanItem。
  • Tactic扩展了PlanItem。
  • 任务扩展了PlanItem。

捕获:

  • 目标有一个策略对象列表。将其称为子项列表。
  • 策略有一个Tactics子列表。
  • Tactic有一个子任务列表。

我本可以一字不差地完成4个完全克隆的课程,但这会让编辑变得非常痛苦。我选择使用继承,但后来出现了循环依赖的问题。

目前我:

让基础PlanItem类有一个字段:

private ObservableList<? extends PlanItem> childPlanItems = FXCollections
        .observableArrayList();

我有一个带有Controller的FXML,ViewPlanItemController,它在TableView中显示特定项目的统计数据和子列表。

public class ViewChildItemsController<E extends PlanItem> {}

TableView具有添加,编辑,查看和删除子项的选项。

如果我想查看子项,那么我们递归加载带控制器的另一个ViewPlanItem.fxml。问题是,每次我想加载另一个ViewChildItem.fxml时,我都需要为它提供子类型,以便它可以查看它们。

如果我试图查看一个目标,我会初始化控制器,以便它知道显示策略类型的项目。

如果需要,这是控制器的init方法:

/**
 * Initializes the values of the items to be displayed.
 *
 * @param list The list of child items to display.
 * @param defCtor Default ctor of each child item.
 * @param copyCtor Copy ctor of each child item.
 */
public void initValues(ObservableList<E> list, Supplier<E> defCtor, UnaryOperator<E> copyCtor) {
    childItemsTableView.setItems(list);
    statisticsPanelController.init(list);
    this.defCtor = defCtor;
    this.copyCtor = copyCtor;
}

我该怎么做?如果我在ViewPlanItemController类本身内,我如何知道子项的类类型?看来它来自Objective-&gt; Strategy-&gt; Tactic-&gt; Task,需要有一些类级别的递归。

1 个答案:

答案 0 :(得分:2)

由于Task实例不(不应该)具有子项,因此将子列表放在其超类中是没有意义的。将它放在不同的类中可能会更好,也许是:

abstract class ParentPlanItem <E extends PlanItem> extends PlanItem {
    // Moved here from PlanItem:
    private ObservableList<E> childPlanItems = FXCollections.observableArrayList();
    // You might also need these:
    private Supplier<E> childConstructor;
    private unaryOperator<E> childCopyConstructor;
}

那可以是ObjectiveStrategyTactic的超类。它有足够的信息来正确调用控制器的init方法。获得childConstructorchildCopyConstructor值的地方是一个单独的问题。我可能会考虑将它们作为相关类的最终静态字段,但是各个类构造函数仍然需要设置它们。大概。你可能会更聪明。