@Data によってクラスが変更された後、複製されたオブジェクトが元のオブジェクトと同じハッシュコードを持つのはなぜですか?

最近コードを入力していると、奇妙な現象を発見しました。

@Data
public class Person implements Cloneable{
    private Integer num;
    private String jobName;

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}

ユーザーが Cloneable を実装した後、clone メソッドを呼び出して生成されたオブジェクトは、ソース オブジェクトと同じハッシュコードを持ちます。

Object の clone メソッドを使用すると、ソース オブジェクトと同じ新しいオブジェクトが返されることがわかっていますが、アドレスが異なるため、アドレスを表すハッシュコードも異なるはずです。

その後、コンパイルおよび生成されたターゲット フォルダー内の Person クラスを確認して、@Data によって変更されたクラスが、クラスの get、set、equals、hashCode、および toString メソッドを提供することを確認しました。書き換えられたハッシュコード メソッドは、クラスの属性の値に基づいてハッシュコードを計算するため、コピー後の 2 つのハッシュコードは同じになります。

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $num = this.getNum();
        int result = result * 59 + ($num == null ? 43 : $num.hashCode());
        Object $jobName = this.getJobName();
        result = result * 59 + ($jobName == null ? 43 : $jobName.hashCode());
        return result;
    }

これを理解した上で、@Dataを@ToString、@Setter、@Getterに変更したところ、問題は解決しました。

@Setter
@Getter
@ToString
public class Person implements Cloneable{
    private Integer num;
    private String jobName;

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}

おすすめ

転載: blog.csdn.net/weixin_47025878/article/details/129101631