我刚刚开始使用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对象之前,将抛出运行时异常。
我也不能使用“之前”,因为那时“骰子”列表还没有被初始化。
我意识到我可以通过将五个die对象传递给构造函数来规避问题,但我宁愿使用无参数构造函数并在构造函数中正确设置所有内容。
我错过了什么吗?
我觉得最小多样性仍然允许在无参数构造函数中创建最小数量的对象。
我注意到我可以使用“懒惰”来阻止Umple代码生成器在处理常规属性时向构造函数添加参数,但遗憾的是这不适用于关联“* - > 5 Die dice”。
任何提示都将非常感激。
我建议您更改关联,使其如下所示:
* -> 0..5 Die dice;
换句话说,将右侧的多重性的下限指定为零。
然后构造函数不会有那个骰子参数。从本质上讲,这相当于关联的“懒惰”。然后,您可以让构造函数以您建议的方式填充它。