Umple-自定义构造函数

时间:2018-07-18 11:22:33

标签: default-constructor umple

我刚刚开始使用Umple,并且遇到过“ before”和“ after”指令似乎都不适合将代码注入构造函数的情况。

考虑以下Umple代码:

class Cup
{
    * -> 5 Die dice;

    after constructor {
        for (int i=0; i<5; i++)
            dice.add(new Die());
    }

    public void throwDice() {
        for (Die d : dice)
            d.throwDie();
    }
}

我想要一个新的杯子对象(表示一个用于骰子游戏的掷骰子和掷骰子的杯子)包含五个骰子对象,因此,以上尝试使用带有“构造函数”的“之后”导演插入相应的代码

但是,这会为构造函数生成以下代码:

public Cup(Die... allDice)  {
    dice = new ArrayList<Die>();
    boolean didAddDice = setDice(allDice);

    if (!didAddDice) {
        throw new RuntimeException("Unable to create Cup, must have 5 dice");
    }

    // line 36 "model.ump"
    for (int i=0; i<5; i++)
        dice.add(new Die());
    // END OF UMPLE AFTER INJECTION
}

这意味着,在我的自定义代码可以添加die对象之前,将引发运行时异常。

我也不能使用“之前”,因为那时“骰子”列表尚未初始化。

我意识到我可以通过向构造函数传入五个模具对象来解决这个问题,但是我宁愿拥有一个无参数的构造函数,并在构造函数中正确设置所有内容。

我想念什么吗?

我觉得最小多重性仍应允许在无参数构造函数中创建最少数量的对象。

我注意到当处理常规属性时,我可以使用“ lazy”来阻止Umple代码生成器向构造函数添加参数,但是不幸的是,这不适用于关联“ *-> 5 Die dice”。

任何提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议您更改关联,以使其如下:

* -> 0..5 Die dice;

换句话说,将右侧多重性的下限指定为零。

然后,构造函数将没有该骰子参数。本质上,这是 相当于“懒惰”的关联。然后,您可以拥有构造函数 按照建议的方式填充它。