是否可以比较包含其他类实例、不包含hashCode和equals的类
我们有3个类别:汽车.java,SUV.java和TestFinal.java
汽车.java(没有哈希代码和等于的简单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(包含汽车实例并包含哈希代码和等于)
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 覆盖逻辑(例如添加等于和哈希代码),以便
suv1.equals(suv2)
返回true
任何意见或建议都是有价值的。
谢谢!!
使用比较器接口也如下:
import java.util.Comparator;
public class CarComparator implements Comparator<Car>{
@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;
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 (new CarComparator().compare(car, other.car)!=0) {
return false;
}
return true;
}
}
希望,这有帮助。
对于 equals
逻辑,您可以使用一个非常丑陋的解决方法:手动比较组成您正在比较的两个 SUV
对象的 Car
对象的相关属性。
基本上:
if(other.car.getManufacturer().equals(car.getManufacturers()))
等。
我仍然强烈建议不要这样做 - 更不用说你会在使用hashCode
时遇到的麻烦!!
另一种可能合适的方法是在实现 SUV
的等于
和哈希代码
时删除 Car s 作为相关比较项,并确定两辆 SUV
之间的相等不受其 Car
的影响。
最后:难道< code>SUV不应该是一辆< code >轿车,而不是拥有一辆< code >轿车?
有没有办法在不更改Car的情况下更新SUV的覆盖逻辑(例如添加equals和hashCode)
不尽然,因为在您的< code>SUV.equals()方法中,您已经
else if (!car.equals(other.car))
{
return false;
}
由于car. equals()
没有被覆盖,它使用Object.equals()
它只是比较对象是否相等。
好吧,您可以将该代码替换为单独比较car
中的每个字段,但您真的想这样做吗?太难看了。最好只覆盖<code>Car.equals()</code>。