来自的java Optaplanner ConstraintFactory似乎返回未初始化的实体
我试图用Optaplanner解决一个简单的概念验证问题,但我遇到了一个不一致的问题。文档(以及其他问题)似乎表明ConstraintFactory.from()
应该只返回初始化的规划实体(like here)
我拥有以下规划实体(仅限相关代码):
@PlanningEntity
public class Enrollment {
@PlanningId
private UUID id;
private Student student;
@PlanningVariable(valueRangeProviderRefs = "possibleLessons", nullable = true)
private Lesson lesson;
// No-arg constructor required for OptaPlanner
public Enrollment() {
}
public Enrollment(UUID id, Student student) {
this.id = id;
this.student = student;
}
public Student getStudent() {
return student;
}
public Lesson getLesson() {
return lesson;
}
}
并试图引入以下约束:
private Constraint studentsLikePreferredSubjects(ConstraintFactory constraintFactory) {
return constraintFactory
.from(Enrollment.class)
.filter(enrollment -> enrollment.getStudent().getPreferredSubjects().contains(enrollment.getLesson().getSubject()))
.reward("Student likes subject bonus", HardSoftScore.ONE_SOFT);
}
这段代码不起作用,因为我在getLesson
:Cannot invoke "Lesson.getSubject()" because the return value of "Enrollment.getLesson()" is null
上得到了一个nullpointerexception
但是,添加一个过滤器以过滤掉空课程确实有效:
private Constraint studentsLikePreferredSubjects(ConstraintFactory constraintFactory) {
return constraintFactory
.from(Enrollment.class)
.filter(enrollment -> enrollment.getLesson() != null)
.filter(enrollment -> enrollment.getStudent().getPreferredSubjects().contains(enrollment.getLesson().getSubject()))
.reward("Student likes subject bonus", HardSoftScore.ONE_SOFT);
}
当然,我可以直接使用这段代码,但我不明白为什么有必要:我希望流中不包含带有null
{Enrollment
,因为我使用的是from
(而不是fromUnfiltered
)。有人能解释这种行为吗
共 (0) 个答案