将类与没有hashCode和equals的类实例进行比较

时间:2016-03-09 16:45:25

标签: java equals hashcode

是否可以比较包含一些其他类实例的Class,它不包含hashCode和equals

我们有3个类:Car.java,SUV.java和TestFinal.java

Car.java(没有hashCode和equals的简单POJO)

public class Car
{
  private long carId;
  private String manufacturer;

  public Car(long carId, String manufacturer)
  {
    super();
    this.carId = carId;
    this.manufacturer = manufacturer;
  }

  /**
   * @return The carId.
   */
  public long getCarId()
  {
      return carId;
  }

  /**
   * @param carId The carId to set.
   */
  public void setCarId(long carId)
  {
      this.carId = carId;
  }

  /**
   * @return The manufacturer.
   */
   public String getManufacturer()
   {
      return manufacturer;
   }

  /**
   * @param manufacturer The manufacturer to set.
   */
  public void setManufacturer(String manufacturer)
  {
      this.manufacturer = manufacturer;
  }
}

SUV.java(包含car的实例,包含hashCode和equals)

public class SUV {
    private Car car;

    /**
     * @return The car.
     */
    public Car getCar()
    {
        return car;
    }

    /**
     * @param car The car to set.
     */
    public void setCar(Car car)
    {
        this.car = car;
    }

    public SUV(Car car)
    {
        super();
        this.car = car;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((car == null) ? 0 : car.hashCode());
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass())
        {
            return false;
        }
        SUV other = (SUV) obj;
        if (car == null)
        {
            if (other.car != null)
            {
                return false;
            }
        }
        else if (!car.equals(other.car))
        {
            return false;
        }
        return true;
    } }

TestFinal是主类,我比较两个SUV对象

public class TestFinal
{
    public static void main(String args[])
    {
        Car car1 = new Car(1, "Toyota");
        Car car2 = new Car(1, "Toyota");

        SUV suv1 = new SUV(car1);
        SUV suv2 = new SUV(car2);

        System.out.println(suv1.equals(suv2));
    }
}

这里

  

suv1.equals(SUV2)

返回false,因为Car不包含覆盖equals和hashCode。有没有办法我可以在不改变Car的情况下更新我的SUV的Overriding逻辑(比如添加equals和hashCode),这样就可以了

  

suv1.equals(SUV2)

返回true

任何意见或建议都是有价值的。

谢谢!

5 个答案:

答案 0 :(得分:0)

对于equals逻辑,您可以使用非常难看的解决方法:手动比较组成您要比较的两个Car对象的SUV个对象的相关属性。

本质:

if (other.car.getManufacturer().equals(car.getManufacturer()))等。

我仍然强烈反对这一点 - 更不用说hashCode给你带来的麻烦!!

另一种可能适用的方法是在Car SUVequals实施hashCode时删除SUV作为相关的比较术语,并确定两者之间的相等Car不受SUV的影响。

最后:不应该Car 成为 Car,而不是 .run(['$rootScope', 'numbersService', function($rootScope, numbersService) { numbersService.getAvailableCodes().$promise.then(function(data) { $rootScope.availableCodes = data.codes; }); }]);

答案 1 :(得分:0)

  

有没有办法可以在不制作的情况下更新SUV的覆盖逻辑   Car中的更改(如添加equals和hashCode)

不是,因为在你的SUV.equals()方法中,你有

else if (!car.equals(other.car))
{
    return false;
}

由于car.equals()未被覆盖,因此它使用Object.equals()来简单地比较对象,例如相等。

好吧,您可以通过单独比较car中的每个字段来替换该代码,但您真的想这样做吗?它很丑。最好覆盖Car.equals()

答案 2 :(得分:0)

我更新了“SUV”这个类,我不是说它是理想的方法,而是一种解决方法......

public class SUV {
    private Car car;

    /**
     * @return The car.
     */
    public Car getCar() {
        return car;
    }

    /**
     * @param car
     *            The car to set.
     */
    public void setCar(Car car) {
        this.car = car;
    }

    public SUV(Car car) {
        super();
        this.car = car;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((car == null) ? 0 : car.hashCode());
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        SUV other = (SUV) obj;
        if (car == null) {
            if (other.car != null) {
                return false;
            }
        } else if (!carEquals(car, other.car)) {
            return false;
        }
        return true;
    }

    private boolean carEquals(Car firstObj, Car otherObj){


        if(otherObj == null){
            return false;
        } else{
            if(firstObj.getCarId() == otherObj.getCarId() && firstObj.getManufacturer().equals(otherObj.getManufacturer())){
                return true;
            } else {
                return false;
            }
        }

    }
}

答案 3 :(得分:0)

您可以让您的SUV类实现Comparable Interface,然后编写自己的逻辑来比较方法compareTo(T o)方法实现中的SUV。您还可以创建一个实现Comapartor接口的类,将SUV与您自己的SUV进行比较逻辑。在Javadoc中了解它:ComparableComparator。但这是一个丑陋的解决方法,实现哈希码,并且肯定是更优先的

答案 4 :(得分:0)

使用比较器接口如下:

import java.util.Comparator;

公共类CarComparator实现了Comparator {

@Override
public int compare(Car o1, Car o2) {
    if(o1 == null || o2 == null){
        return -1;
    } else if(o1!=null && o2 == null){
        return -1;
    } else if(o1==null && o2!=null){
        return -1;
    } else{
        if(o1.getCarId() == o2.getCarId() && o1.getManufacturer().equals(o2.getManufacturer())){
            return 0;
        } else {
            return -1;
        }
    }

}

}

然后是SUV等级:

package test.corejava.concepts;

公共级SUV {     私家车;

/**
 * @return The car.
 */
public Car getCar() {
    return car;
}

/**
 * @param car
 *            The car to set.
 */
public void setCar(Car car) {
    this.car = car;
}

public SUV(Car car) {
    super();
    this.car = car;
}

/**
 * {@inheritDoc}
 */
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((car == null) ? 0 : car.hashCode());
    return result;
}

/**
 * {@inheritDoc}
 */
@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    SUV other = (SUV) obj;
    if (car == null) {
        if (other.car != null) {
            return false;
        }
    } else if (new CarComparator().compare(car, other.car)!=0) {
        return false;
    }
    return true;
}

}

希望,这有助于......