Optaplanner可空变量场景下from与fromUnfiltered行为澄清咨询
结论
你的测试结果完全正确,from方法的JavaDoc表述是准确的,对应版本的官方用户文档关于from的说明没有覆盖可空规划变量的场景,存在表述偏差。
两种方法的具体行为差异
from(Class<T> fromClass)
- 若入参为问题事实类(未被
@PlanningEntity注解修饰的类):直接返回所有该类的实例,无额外过滤逻辑 - 若入参为规划实体类:仅过滤「非
nullable规划变量值为null」的未初始化实体。如果实体的规划变量全部标注了nullable = true,哪怕这些变量的值为null,也会被from()正常纳入约束流,不会被过滤。
fromUnfiltered(Class<T> fromClass)
无论入参是问题事实类还是规划实体类,都直接返回所有该类的实例,完全不做规划变量初始化校验,哪怕实体的非nullable规划变量为null也会被包含在约束流中。
补充说明
官方用户文档中关于「from()会过滤所有带null规划变量的实体」的表述,是默认规划变量未开启nullable的场景下的简化说明,没有覆盖可空变量的特殊情况,才会出现和实际运行逻辑不符的问题。
使用建议
- 常规业务约束开发优先使用
from(),它的自动过滤逻辑可以帮你排除未初始化的无效实体,避免不必要的评分计算错误。 - 仅当你需要在约束中主动处理非
nullable规划变量未赋值的实体(例如自定义初始化阶段的特殊约束逻辑)时,再选择使用fromUnfiltered()。
内容的提问来源于stack exchange,提问作者minioim
相关产品推荐
相关产品推荐

