0
public class Car
{
    private String name;  
    public int id;     


    public Car(String name, int id) 
    {
        this.name = name;
        this.id = id;
    }

@Override
public boolean equals(Object ob) 
{
    if (!(ob instanceof Car))
    {    
      return false;
    }
 Car that = (Car)ob;
 return this.id == that.id;
}

@Override
public int hashCode() 
{
    return id;
}
// this class also got getters and setters 

それから私は別のクラスを得ました

public class CarList
{
        private Collection<Car> cars;

    public CarList()
    {
        cars = new HashSet<>();
    }


   public boolean insertCar(Car car)
    {
        return cars.add(car); 
    }

私の質問は: equals() および hashCode() メソッドを適切にオーバーライドする方法です。ここで、オブジェクトの比較と hashCode の計算のために 'id' および 'name' 属性を考慮します (したがって、同じ名前と ID を持つ 2 つのオブジェクトを持つ可能性はありません) - このコードでは、オブジェクトの比較に 'id' 属性のみを使用するため)?

4

2 に答える 2

3

使用する代わりに

if (!(ob instanceof Car))
{    
  return false;
}

の使用を検討する必要があります。

if (getClass() != obj.getClass())
  return false;

同じ名前と IDを持つForWdCar extends Carandがあると仮定します。TwoWdCar extends Car

それらを等しくしたいですか?最初の解決策、

それらを不平等にしたいですか?2番目のソリューション

あなたは気にしません、そのようなケースは起こりませんか?2番目の解決策は、より高速です。

于 2013-10-28T19:12:10.150 に答える
3

Java 7 の時点で、Objects実装hashCodeequals容易にする静的メソッドがあります。型の互換性を判断するgetClass()代わりに使用したくない場合、これはうまく機能するはずです。instanceofそれは、 のサブクラスが s とどのようにCar比較されるかによって異なりCarます。

@Override
public boolean equals(Object ob) 
{
    if (!(ob instanceof Car))
    {    
      return false;
    }
 Car that = (Car)ob;
 return Objects.equals(this.id, that.id) && Objects.equals(this.name, that.name);
}

@Override
public int hashCode() 
{
    return Objects.hash(id, name);
}
于 2013-10-28T19:02:57.557 に答える