是否可以比较包含一些其他类实例的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
任何意见或建议都是有价值的。
谢谢!
答案 0 :(得分:0)
对于equals
逻辑,您可以使用非常难看的解决方法:手动比较组成您要比较的两个Car
对象的SUV
个对象的相关属性。
本质:
if (other.car.getManufacturer().equals(car.getManufacturer()))
等。
我仍然强烈反对这一点 - 更不用说hashCode
给你带来的麻烦!!
另一种可能适用的方法是在Car
SUV
和equals
实施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中了解它:Comparable和Comparator。但这是一个丑陋的解决方法,实现哈希码,并且肯定是更优先的
答案 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;
}
}
希望,这有助于......