2012-03-27 3 views
1
public abstract class HolidayPackageVariant { 
private HolidayPackage holidayPackage; 
private String typeHolidayPackage; 

@Override 
    public int hashCode() { 
     return Objects.hashCode(getTypeHolidayPackage(), getHolidayPackage()); 
    } 
} 

public final class FlightHolidayPackageVariant extends HolidayPackageVariant{ 
private Destination originCity; 

@Override 
    public int hashCode() { 
     // need to add super.hashCode() here somehow ? 
     return Objects.hashCode(getOriginCity()); 
    } 
} 

Googleグーバのhashode():Objects.hashCodeはメンバーオブジェクトで機能します。 derived :: hashCode()でスーパークラスhashCode()を指定するにはどうすればよいですか?私は直接派生クラスのhashCode()関数でsuper.membersを使用できますが、super.hashCode()が何らかの方法で変更された場合、それはderived:hashCode(...)に反映されません。これは本当に、おそらくではありません。google guava hashCode()でsuper.hashcodeを呼び出す方法

public int hashCode() { 
    return Objects.hashCode(getOriginCity(), super.hashCode()); 
} 
+0

ヒントを、ドキュメントから注意してください。 " Java 7以降の注意:このメソッドは非推奨として扱われ、代わりにObjects.hash(java.lang.Object ...)を使用してください。 – dgtc

答えて

8

非答えのため申し訳ありませんが:

+0

最近、誰かが私に似たようなことを提案しました。正直なところ、私はこの時点で非常に混乱しています。どのように/私がこのデザインに着いたのかを見ていただければ幸いです。それは私がここで尋ねた質問から進化しました:http://programmers.stackexchange.com/questions/140967/how-should-i-design-objects-around-this-business-requirementこれをバックエンドのDBデザインとしてください:http: //dba.stackexchange.com/questions/14663/how-do-i-model-this-in-database/14665#14665 ORMとして 'Hibernate'を使用しています。あなたが私を正しい方向に向けることができれば幸いです。 – brainydexter

+1

私はアイテム8,16、さらには20を読みました。その結果を理解しています。しかし、私の場合、何かを指摘したいと思います。基底クラスHolidayPackageVariantは 'abstract'クラスであり、LandHolidayPackageVariantとFlightHolidayPackageVariantは' final'具体的実装です。私はタグ付けされたクラスについても考えましたが、Effective Javaからは、両方のバリエーションが基本クラスHolidayPackageVariantに格納されている「HolidayPackage」を参照しているので、正しいことをしているようです。どう思いますか ? – brainydexter

5

ハッシュコードはこれだけハッシュを構成するオブジェクトでsuper.hashCode()を含め、(オート箱入りInteger)オブジェクトそのものでありますあなたがしたいこと。 有効なJavaは、なぜ値型をサブクラス化して追加の値コンポーネントを追加するのかについての長い探求がありません。第2版​​では、項目8「等しいをオーバーライドするときの一般契約に従ってください。」です。また、項目16「継承上の構成を優先」を参照してください。

+0

私は、オブジェクトのhashCode関数を見て、引数としてオブジェクトを期待しています。 'ハッシュコードそのものが(autoboxed)オブジェクトであるということは何を意味するのですか? – brainydexter

+2

hashcode()は 'int'を返します。これは' Integer'に自動ボクシングされます。 –

0

クラスには新しいデータメンバーが1つしかないため、Objects.hashCode(Object...)を使用する必要はありません。代わりにこれを試してみてください:

public int hashCode() { 
    Destination oc = getOriginCity(); 
    return 31 * super.hashCode() + (null == oc ? 0 : oc.hashCode()); 
} 

あなたはサブクラスで、多くの新しいデータメンバーを持っている場合は、このようなものでも動作します:Javaの7以降のユーザーのための

public int hashCode() { 
    return 31 * super.hashCode() + Objects.hashCode(getOriginCity(), getOtherData(), getMoreData()); 
} 
関連する問題