如何重写方法 equal 和 hashcode (Groovy)

问题描述 投票:0回答:1

我在下面创建了

Person

public class Person {
    private String sCode;
    private String sDate;

    Person(String sCode, String sDate) {
        this.sCode = sCode;
        this.sDate = sDate;
    }// Constructor and other methods...

    @Override
    boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person oPerson = (Person) obj;
        return oPerson.sCode == this.sCode && oPerson.sDate == this.sDate;
    }

    @Override
    public int hashCode() {
        return Objects.hash(this.sCode, this.sDate);
    }
}

我想将

Person
对象存储在
HashSet
(personSet) 中:

HashSet<Person> personSet = new HashSet<>();
Person person1 = new Person("Aman", "2021-01-01");
Person person2 = new Person("Aman", "2021-01-01");
personSet.add(person1);
personSet.add(person2);
System.out.println(personSet.size());  //Expected size to be "1"

但是我遇到了错误

Caught: java.lang.StackOverflowError
,如下:

Caught: java.lang.StackOverflowError
java.lang.StackOverflowError
    at Person.equals(Person.groovy:12)

有人可以建议我为什么我的代码会抛出此错误吗?

groovy
1个回答
0
投票

在 Groovy 中,

==
调用
.equals
。 因此,
if (this == obj) return true
行创建了无限循环,导致堆栈溢出异常。如果 您想知道两个参考是否相同,请使用
.is
,例如
if (this.is(obj)) return true

也就是说,几乎没有理由编写自己的“等于和” 哈希码”(或者更糟糕的是,让你的 IDE 生成它们)与 Groovy。有

EqualsAndHashCode
, 只需一行代码即可完成您所需要的操作,并且很可能会执行此操作 它的最好版本。

© www.soinside.com 2019 - 2024. All rights reserved.