如果 equals 方法支持通配符,则 hashCode 方法

我有一个类,它的对象将存储在 hashmap、hashset 中。


我需要支持字段的通配符相等性,因此我添加了该签入equals方法。现在,如何基于此参数构建我的哈希码方法?即,如果我按照下面的代码进行计算,我将获得 2 个通过我的 equals 方法的相等性检查的对象的不同哈希码。


例如,考虑以下课程:


public class Person {   


    private String fname = "";

    private String lname = "";

    private String profession = "";


    // getters & setters




    @Override

    public boolean equals(Object obj) {

        if (fname == null) {

            if (other.fname != null)

                return false;

        } else if (!fname.equals(other.fname) && !other.fname.equals("*") && !fname.equals("*"))

            return false;

        return true;


        // similar for other fields

    }



    @Override

    public int hashCode() {     

        return Objects.hashCode(this.fname, this.lname , this.profession);

    }

}

编辑:


正如一些评论中指出的那样,应该有一个单独的方法来检查通配符是否相等。这种方法的限制是我将无法获得正确的结果,就像set.contains他们在object.equals内部检查一样。因此set.contains,即使我的对象通过了单独的通配符相等方法的相等测试,我也会返回 false。


慕慕森
浏览 151回答 1
1回答

浮云间

在 in 中使用相同的逻辑hashCode()是不可能的,因为我们不根据比较对象计算哈希码,而是根据当前对象 state 计算它。您可以在该hashCode()方法中返回一个常量值,但效率不高,因此听起来不是一个好主意。您最初的问题来自这样一个事实,即您想要赋予一个并非设计为该equals()方法的责任:定义超出对象实际状态(即实际字段值)的相等性。因此您不应该使用该equals()方法来执行通配符比较,而应为其编写专用方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java