论坛首页 Java企业应用论坛

实现实体的hashCode,equals时候请注意

浏览 46696 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-11-24  
Readonly,偶们什么都用,不管list,hashset,hashmap,bag.........

   不过,属List最烦人了,尤其双向关系的时候........写这东西的代码的时候,我都很小心测试,除非必要都不用List.
0 请登录后投票
   发表时间:2004-11-24  
双向list应该死定吧,index不完整!
0 请登录后投票
   发表时间:2004-11-24  
weihello 写道

还有yucai说的,“就是因为这个问题,我才对这种方式保持警惕”, 如果问题

确实出在这里,我可以一次性全部解决,改动也只有一处。 而其说的“真有你说

的场景,我会考虑再加上,可还是没有碰上”却是真正的地雷。 显然,他这样做是

本末倒置,为了贪图方便牺牲其他的一些可操作性。

呵呵,没有看见应用场景怎么说我丧失了可操作性?为了没有看见的场景而增加代码复杂度,才真是累啊.
所以,我倒觉得你是本末倒置.
此话题直到你能举出一个非用不可的场景时,我再继续.
0 请登录后投票
   发表时间:2004-11-24  
嘿嘿,youcai,我实际上已经列了,你仔细看帖子的话

引用
双向list应该死定吧,index不完整!


  可以是可以滴,就是麻烦些而已了。
0 请登录后投票
   发表时间:2004-11-24  
愿闻其详,大前天想了大半天都没办法,然后对自己说,以后遇到这样的问题,一边用list,一边用bag好了。还有顺便问个问题,在你最前面的说的例子中,作了group到user的集合引用,不怕user很多很多,系统慢吗,就算所有都作了cache和lazy?
0 请登录后投票
   发表时间:2004-11-25  
双向关系的List你需要双边都维护并更新,比较烦而已。其他没有什么。

  至于你说的比较,其实真正在程序中是小概率事件。 比如,在一个session中,这种情况从头到尾巴都要比的并不多。

  即使从头到尾,效率也并非你想象那般低。你做个简单的测试就知道了。
0 请登录后投票
   发表时间:2004-11-26  
weihello 写道
嘿嘿,youcai,我实际上已经列了,你仔细看帖子的话

没有看出来,你难道是依赖于timerange的equals()做并,交等等的操作吗?如果那样的话,我就无话可说了。我是不会那么作的。

双项的操作真是不是一般的烦,尤其是几个类之间都有这样的关系的时候,我曾经做的一个系统,要求group之间可以多对多双向,group和user之间多对多,最后做出来的东西惨不忍睹。
0 请登录后投票
   发表时间:2005-01-13  
shenli 写道
业务字段不一定就有就有唯一的,不可变的,就像这个论坛的用户信息一样(当然我只是从表面看),说实话,我个人觉得ID本来是最好的。既然这个ID放在实体对象里面,就不代表它仅仅是数据表的主键,而确实是对象自身的标识符。只是由于ID是延迟赋值的,导致这样的矛盾,存在了这样具有奇怪状态的实体。而用业务字段生成hashcode一样会出现HashSet无法重读的现象(当然不会在这样的语义下),只是ID的改变被hibernate隐藏了,不是显式的,所以有点莫名其妙。另外,既然用业务字段来做hashcode之类给我的感觉ID的属性就有点多余了,只是为了迎合关系数据库,象prevayler应该就不需要。

PS 实在不行我可以强制要求所有的entity在new出来之前都保存一次数据库,用工厂创建,当然有点开销,出问题了回滚事务,不知道行不行


今天看到一篇blog: http://jroller.com/page/jcarreira/20041215 ,和shenli说的做法很像,只是new出来以前,采用assigned主键,给一个UUID。
而且给出了详细的优点和缺点比较,偶被打动了,试验一下,看看能不能用在以后的项目中......
0 请登录后投票
   发表时间:2005-01-13  
commons lang下有现成的方法可以用啊,基类调用一下就可以了:
public class Entity implements Serializable {

    public String toString(); {
        return ToStringBuilder.reflectionToString(this,
                ToStringStyle.MULTI_LINE_STYLE);;
    }

    public boolean equals(Object o); {
        return EqualsBuilder.reflectionEquals(this, o);;
    }

    public int hashCode(); {
        return HashCodeBuilder.reflectionHashCode(this);;
    }
}
0 请登录后投票
   发表时间:2005-10-20  
被讨论的我也纳闷了,commons lang都能直接套用的,为什么还要搞这么麻烦,下面的代码难道有问题?不知道commons lang有没有解决各位说的问题
   
public String toString(); {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);;
    }

    public boolean equals(Object o); {
        return EqualsBuilder.reflectionEquals(this, o);;
    }

    public int hashCode(); {
        return HashCodeBuilder.reflectionHashCode(this);; 
    }
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics