如何比较对象的私有数据字段以确保它们是相同的(Java)?

时间:2015-01-12 08:06:04

标签: java class object boolean

刚开始,这是家庭作业/实验室,我正在寻求建议。我正在开发一个非常小的程序,它本质上是一个具有最小/最大值约束的计数器和一个将值推高的方法,另一个将值推回零的方法。因此,我的Counter类的私有数据字段是:

private int minimum; 
private int maximum; 
private int currentValue; 

我遇到的麻烦是使用一种方法将我的Counter Class与基于同一类的另一个理论对象进行比较。在这种情况下,我们希望看到两个对象之间的数据字段是相同的。我已经研究了几种方法,包括使用反射和着名的EqualsBuilder,但是在实现每个方面都遇到了麻烦。

这是他们给我的代码。

public boolean equals(Object otherObject)
{
    boolean result = true;
    if (otherObject instanceof Counter)
    {

    }
    return result;
}

4 个答案:

答案 0 :(得分:1)

假设你的equals方法在Counter类中,它可以访问该类的所有私有成员,即使它们是该类的不同实例的成员。

public boolean equals(Object otherObject)
{
    if (otherObject instanceof Counter)
    {
        Counter ocounter = (Counter) otherObject;
        if (this.minimum != ocounter.minimum)
            return false;
        ...
    } else {
        return false;
    }
    return true;
}

答案 1 :(得分:1)

实施equals - 方法可能会非常痛苦,特别是如果您的班级中有很多属性。

equals-method州的JavaDoc

  

请注意,一旦覆盖此方法,通常需要覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希码

并且,如果您检查JavaDoc以查找hashCode-method

  
      
  • 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。
  •   
  • 如果两个对象根据equals(Object)方法不相等则不是必需的,那么在两个对象中的每一个上调用hashCode方法必须产生不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
  •   

因此,通常建议您同时实施这两种方法(equalshashCode)。下面显示了一种基于Java 7附带的java.util.Objects类的方法。方法Objects.equals(Object, Object)处理空检查,使代码更简单,更易于阅读。此外,hash-method是创建可与hashCode一起使用的值的便捷方式。

所以,回答你的问题。要访问其他对象的属性,只需执行类型转换即可。之后,您可以访问其他对象的私有属性。但是,请记住在使用 instanceof 检查类型后始终执行此操作。

@Override
public boolean equals(Object other) {
    if (other instanceof Counter) { // Always check the type to be safe
        // Cast to a Counter-object
        final Counter c = (Counter) other;

        // Now, you can access the private properties of the other object
        return Objects.equals(minimum, c.minimum) &&
               Objects.equals(maximum, c.maximum) &&
               Objects.equals(currentValue, c.currentValue);
    }
    return false; // If it is not the same type, always return false
}

@Override
public int hashCode() {
    return Objects.hash(currentValue, maximum, minimum);
}

答案 2 :(得分:0)

由于equalsCounter的一种方法,您可以访问Counter的所有私有字段,因此您可以执行以下操作:

if (otherObject instanceof Counter)
{
    if (this.minimum != ((Counter) otherObject).minimum) {
        result = false;
    }
    // [...]
}

答案 3 :(得分:0)

假设您的班级名为Counter,并且您为所有私人字段(您应该这样做)创建了getters

    @Override 
    public boolean equals(Object other) {
        boolean result = false;
        if (other instanceof Counter) {
            Counter c= (Counter) other;
            result = (this.getMinimum() == that.getMinimum() &&
                     this.getMaximum() == that.getMaximum() &&
                     this.getCurrentValue() == that.getCurrentValue());
        }
        return result;
    }