Xtext验证问题:如何检测球员列表中的重复名称?
问题分析与修复方案
你的验证代码没生效主要是两个关键问题导致的,我帮你拆解并给出修正后的实现:
1. 错误标记的目标不对
你现在把错误绑定到了FOOTBALLPACKAGE.Literals.FOOTBALL__PLAYERS_LIST(也就是Football类的playerList属性),这会让错误提示显示在整个俱乐部的球员列表上,甚至可能因为Xtext的验证上下文匹配规则,导致错误根本不显示。正确的做法应该是把错误标记在重复的那个球员引用条目上,也就是PlayerList类的players特征。
2. 可以补充防御性判断
虽然你的Xtext语法里playerList是必填项,但加上空指针判断能让代码更健壮,避免意外情况。另外,方法名也建议改成更贴合业务的名字,方便后续维护。
修正后的验证代码
@Check def checkDuplicatePlayerNames(Football model) { val names = newHashSet<String>() // 防御性判断,避免playerList为空的情况 if (model.playerList != null) { for (player : model.playerList.players) { // 确保player实例不为空(语法约束下一般不会出现,但加上更稳妥) if (player != null && !names.add(player.name)) { // 错误标记在重复的球员引用上,用PlayerList的players特征 error("Player name '" + player.name + "' is duplicated in the list", player, FOOTBALLPACKAGE.Literals.PLAYER_LIST__PLAYERS) } } } }
额外的语法简化提示
你的Xtext语法里PlayerList的定义可以简化一下,效果完全一样:
PlayerList: players+=[Player]* ;
players+=[Player]*等价于你原来写的players+=[Player] (players+=[Player])*,代码更简洁。
内容的提问来源于stack exchange,提问作者JDoe
相关产品推荐
相关产品推荐

