我有Spring MVC应用程序。我有实体课考试。我重写方法eqauls所以我可以使用包含List接口的方法。当我尝试添加新考试时,我看看是否已经添加了它。但是当我通过考试对象到mathod包含时,我总是有不同的学生。例如: 我需要在Student Jone上添加考试。我尝试添加它并获得另一个信息:Kate:Jone,而不是Jone:Jone。我不知道为什么会发生这种情况,因为当我将学生设为Jone时,我通过考试对象。</ p>
@Override
public boolean equals(Object arg) {
Examination exam = (Examination) arg;
System.out.println(exam.getStudent().getStudentFullName() + ":" + this.getStudent().getStudentFullName());
if (!this.subject.getSubjectTitle().equals(exam.getSubject().getSubjectTitle()))
return false;
else
return true;
}
我尝试添加考试的代码
examination.setStudent(currentStudent); // set student
examination.setSubject(subjectExam); // set subject
if(es.selectAllExams().contains(examination)) {
return "error";
} else {
es.insertExam(examination); // add to database
return "success";
}
答案 0 :(得分:2)
在equals方法中,您只比较标题,而不是学生名称。因此,如果您有两个相同标题的考试,但不同的学生名称相同(基于您的等于方法)。比较equals方法的学生,你应该是好的。通常,优先实现覆盖equals和hashcode方法。
您的equals方法的实现通常不遵循覆盖equals方法的最佳实践。谷歌有点“java equals方法最佳实践” - 你会发现这样的事情:http://javarevisited.blogspot.sk/2011/02/how-to-write-equals-method-in-java.html
如果你懒于编写自己的equals或hashcode方法(或者你有其他原因),你可以使用:
或
答案 1 :(得分:0)
你说你覆盖equals()
所以我可以使用包含List接口的方法
但是,您没有来覆盖该方法以使用contains()
。有一个适合大多数用途的默认实现;归结为“这些对象是同一个实例吗?”。正如之前的响应者指出的那样,你的实现正在打破这种逻辑;所有具有相同标题的考试都将被视为同一个对象,因此只要您的列表中有一个与您尝试添加的考试具有相同标题的考试,contains()
检查将始终返回{{1} },你将永远无法添加另一个。
如果您确实希望基于所涉及的标题和学生的平等,那么之前的答案是正确的 - 您将要覆盖 true
和{{1}确保在两种方法中考虑所有对考试身份都重要的字段。