关于OptaPlanner TaskAssigning示例未调用setEmployee赋值的疑问
OptaPlanner绕过setter直接赋值的原因
OptaPlanner默认会直接通过字段反射为规划变量赋值,完全不需要依赖setter方法,这就是你遇到的现象的核心原因。
具体细节:
- 性能优先:求解过程中会高频次修改规划变量(比如Task的employee字段),直接操作字段比调用setter方法的性能开销小得多,在大规模求解场景下能明显提升效率。
- 默认访问模式:在
@PlanningVariable注解中,默认的accessType属性值是AccessType.FIELD,这会告诉OptaPlanner直接通过反射访问实体类的字段,而非调用对应的setter方法。 - 无需setter的验证:你注释掉setEmployee方法后项目仍能运行,就是因为OptaPlanner根本没调用这个方法,它直接对employee字段进行读写操作。
- 切换到setter模式(可选):如果想要强制OptaPlanner使用setter方法,只需在
@PlanningVariable注解中显式设置accessType = AccessType.PROPERTY,此时OptaPlanner就会通过setEmployee方法来赋值。
内容的提问来源于stack exchange,提问作者StefanoM
相关产品推荐
相关产品推荐

