Hibernate 系列 08 - 对象识别机制
发布时间:2016-10-31 11:54:52  所属栏目:教程  来源:站长网 
            导读:副标题#e# Hibernate 系列 学习笔记 目录 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(==号识别) 2. equals()和hashCode()识别 如果两个对象的内存地址相同,毫无疑问,它们是相同的。 如果要比较的是对象携带的信息,使用内存地址识别就不可
                
                
                
            | 
                         例如:若studentNo的类型是String,代码如下:  1 public class Student {
 2 
 3     @Override
 4     public boolean equals(Object obj) {
 5         if (this == obj) return true;  // 如果内存地址相等,返回true
 6         if (this.studentNo == null || !(obj instanceof Student)) return false;
 7         Student stu = (Student) obj;
 8         return this.studentNo.equals(stu.studentNo);
 9     }
10 
11     @Override
12     public int hashCode() {
13         return this.studentNo.hashCode();
14     }
15 
16 }
 通过studentNo来比较对象是否相等存在一些问题。 因为当一个对象被new出来而还没有save()的时候,它并不会被赋予studentNo值,这是这个方法就不太适合了。 通常使用的方法是根据对象中真正包含的属性值来做比较,例如:  1 public class Student {
 2 
 3     @Override
 4     public boolean equals(Object obj) {
 5         if (this == obj) return true;  // 如果内存地址相等,返回true
 6         if(!(obj instanceof Student)) return false;
 7         Student stu = (Student)obj;
 8         if(!getStudentName().equals(stu.getStudentName())) return false;
 9         if(!getBornDate().equals(stu.getBornDate())) return false;
10         return true;
11     }
12 
13     // 通过一个简单的算法得到哈希码
14     @Override
15     public int hashCode() {
16         int result;
17         result = getStudentName().hashCode();
18         result = 29*result+getBornDate().hashCode();
19         return result;
20     }
21 
22 }
 上述例子不再简单地比较studentNo值了,而是根据学生姓名和生日对Student对象实例进行比较。因为基本上名字和生日就能确定一个人的身份了。 当然,实现的方法还有很多,也可以使用其他的属性来比较Student的身份,这就要根据实际的需求来决定了。 
 (编辑:源码门户网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  

