有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自的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);
    }

这段代码不起作用,因为我在getLessonCannot 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) 个答案