Apache Commons等于 hashCode构建器

Apache Commons等于 hashCode构建器,第1张

Apache Commons等于/ hashCode构建

commons / lang构建器很棒,我使用它们已有多年了,而没有明显的性能开销(带有和不带有hibernate状态)。但正如Alain所写,番石榴的方法更好:

这是一个示例Bean:

public class Bean{    private String name;    private int length;    private List<Bean> children;}

这是用Commons / Lang实现的equals()和hashCode():

@Overridepublic int hashCode(){    return new HashCodeBuilder()        .append(name)        .append(length)        .append(children)        .toHashCode();}@Overridepublic boolean equals(final Object obj){    if(obj instanceof Bean){        final Bean other = (Bean) obj;        return new EqualsBuilder() .append(name, other.name) .append(length, other.length) .append(children, other.children) .isEquals();    } else{        return false;    }}

这里是Java 7或更高版本(受Guava启发):

@Overridepublic int hashCode(){    return Objects.hash(name, length, children);}@Overridepublic boolean equals(final Object obj){    if(obj instanceof Bean){        final Bean other = (Bean) obj;        return Objects.equals(name, other.name) && length == other.length // special handling for primitives && Objects.equals(children, other.children);    } else{        return false;    }}

注意:此代码最初引用了Guava,但正如注释所指出的那样,此功能自JDK中引入以来,因此不再需要Guava。

如您所见,Guava / JDK版本较短,并且避免了多余的辅助对象。在相等的情况下,如果更早的

Object.equals()
调用返回false,它甚至可以使评估短路(公平地说:commons / lang有一种
ObjectUtils.equals(obj1,obj2)
具有相同语义的方法,可以用来代替
EqualsBuilder
上面的短路)。

所以:是的,与手动构建的方法

equals()
hashCode()
方法(或Eclipse将为您生成的那些可怕的怪物)相比,公共语言生成器更可取,但是Java7+ / Guava版本更好。

还有关于hibernate的说明:

请注意在equals(),hashCode()和toString()实现中使用惰性集合。如果您没有公开的会议,那将惨遭失败。


注意(关于equals()):

a)在上述equals()的两个版本中,您可能还希望使用以下一个或两个快捷方式:

@Overridepublic boolean equals(final Object obj){    if(obj == this) return true;  // test for reference equality    if(obj == null) return false; // test for null    // continue as above

b)根据您对equals()合约的解释,您还可以更改行

    if(obj instanceof Bean){

    // make sure you run a null check before this    if(obj.getClass() == getClass()){

如果使用第二个版本,则可能还需要

super(equals())
equals()
方法内部进行调用。意见分歧在此,在此问题中讨论主题:

将超类合并到GuavaObjects.hashpre()实现中的正确方法?

(尽管大约是

hashCode()
,这也适用于
equals()


注意(灵感来自kayahr的评论)

Objects.hashCode(..)``Arrays.hashCode(...)
如果您有许多原始字段,则(与底层一样)的性能可能会很差。在这种情况下,
EqualsBuilder
实际上可能是更好的解决方案。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5010073.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存