org.apache.commons.lang.builder
クラス HashCodeBuilder

java.lang.Object
  拡張org.apache.commons.lang.builder.HashCodeBuilder

public class HashCodeBuilder
extends Object

HashCode を生成する処理です。

このクラスはより良いハッシュコードをクラス内で生成する事を可能にします。 これは Joshua Bloch の Effective Java で説明されているルールに従います。 良い hashCode を書くことは、実際には非常に困難です。 このクラスはこれを簡単にする事を目的とします。

オブジェクト内の関連する全てのフィールドをハッシュコードに含めるべきです。 取得されたフィールドは除外されるかもしれません(訳注 意味がわからず直訳です)。 一般的に equals メソッドで使用される全てのフィールドを hashCode メソッド内で使用する必要があります。

一般的な使用方法を以下に示します:

 public class Person {
   String name;
   int age;
   boolean isSmoker;
   ...
 
   public int hashCode() {
     // you pick a hard-coded, randomly chosen, non-zero, odd number
     // ideally different for each class
     return new HashCodeBuilder(17, 37).   
       append(name).
       append(age).
       append(smoker).
       toHashCode();
   }
 }
 

もう一つの方法として、リフレクションを使用してフィールドを比較するメソッドがあります。 普通、対象となるフィールドは private であるため、この reflectionHashCode メソッドは フィールドのアクセス制限を変更するために Field.setAccessible を使用します。 これは適切なパーミッションが設定されていない限り、セキュリティマネージャが稼動している状態では行うことができません。 また、この方法は明らかに低速です。

このメソッドの一般的な使用方法は以下の様になります:

 public boolean hashCode(Object o) {
   return HashCodeBuilder.reflectionHashCode(this);
 }
 

バージョン:
$Id: HashCodeBuilder.java,v 1.1.1.1 2004/02/13 10:02:04 hioki Exp $
作成者:
Stephen Colebourne
翻訳者:
日置 聡

フィールドの概要
private  int iConstant
          ハッシュコードを作成する際に使用される定数。
private  int iTotal
          ハッシュコードの処理された総計。
 
コンストラクタの概要
HashCodeBuilder()
          HashCodeBuilder のコンストラクタです。
HashCodeBuilder(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber)
          HashCodeBuilder のコンストラクタです。
 
メソッドの概要
 HashCodeBuilder append(boolean value)
          boolean をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(boolean[] array)
          boolean の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(byte value)
          byte をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(byte[] array)
          byte の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(char value)
          char をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(char[] array)
          char の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(double value)
          double をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(double[] array)
          double の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(float value)
          float をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(float[] array)
          float の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(int value)
          int をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(int[] array)
          int の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(long value)
          long をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(long[] array)
          long の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(Object object)
          Object をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(Object[] array)
          Object の配列をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(short value)
          short をハッシュコードを生成するための対象に加えます。
 HashCodeBuilder append(short[] array)
          short の配列をハッシュコードを生成するための対象に加えます。
static int reflectionHashCode(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber, Object object)
          このメソッドはハッシュコードを生成するためにリフレクションを使用します。
static int reflectionHashCode(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber, Object object, boolean testTransients)
          このメソッドはハッシュコードを生成するためにリフレクションを使用します。
static int reflectionHashCode(Object object)
          このメソッドはハッシュコードを生成するためにリフレクションを使用します。
static int reflectionHashCode(Object object, boolean testTransients)
          このメソッドはハッシュコードを生成するためにリフレクションを使用します。
 int toHashCode()
          計算されたハッシュコードを返します。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

iConstant

private final int iConstant
ハッシュコードを作成する際に使用される定数。


iTotal

private int iTotal
ハッシュコードの処理された総計。

コンストラクタの詳細

HashCodeBuilder

public HashCodeBuilder()
HashCodeBuilder のコンストラクタです。 このコンストラクタはハードコーディングされた2つの値をハッシュコードを生成する際に使用するために設定します。


HashCodeBuilder

public HashCodeBuilder(int initialNonZeroOddNumber,
                       int multiplierNonZeroOddNumber)
HashCodeBuilder のコンストラクタです。 2つのランダムに選ばれた0でない奇数の値を指定する必要があります。 理想をいえばこの値はクラス毎に異なった方が良いのですが、これはさほど重要ではありません。 乗数より素数の方がより好まれます。

パラメータ:
initialNonZeroOddNumber - 初期値として使用される0でない奇数
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
例外:
IllegalArgumentException - 指定された数値が0または偶数だった場合
メソッドの詳細

reflectionHashCode

public static int reflectionHashCode(Object object)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。

このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 transient メンバーは、おそらくフィールドの値から取得されたものでオブジェクトの値とはならないと考え、 処理の対象としません。 static フィールドは処理の対象にはなりません。 このメソッドはコンストラクタで設定された2つの定数をハッシュコードの生成に使用します。

パラメータ:
object - ハッシュコードを生成する対象となるオブジェクト
戻り値:
ハッシュコードの int
例外:
IllegalArgumentException - オブジェクトが null だった場合

reflectionHashCode

public static int reflectionHashCode(Object object,
                                     boolean testTransients)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。

このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 testTransients 引数に true が設定された場合 transient メンバーを処理の対象とし、 false が設定された場合にはフィールドの値から取得されたものでオブジェクトの値とはならないとみなし、 transient メンバーを無視します。 static フィールドは処理の対象にはなりません。 このメソッドはハードコーディングされた2つの定数をハッシュコードの生成に使用します。

パラメータ:
object - ハッシュコードを生成する対象となるオブジェクト
testTransients - transient フィールドを含めるかどうか
戻り値:
ハッシュコードの int
例外:
IllegalArgumentException - オブジェクトが null だった場合

reflectionHashCode

public static int reflectionHashCode(int initialNonZeroOddNumber,
                                     int multiplierNonZeroOddNumber,
                                     Object object)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。

このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 transient メンバーは、おそらくフィールドの値から取得されたものでオブジェクトの値とはならないと考え、 処理の対象としません。 static フィールドは処理の対象にはなりません。

2つのランダムに選ばれた0でない奇数の値を指定する必要があります。 理想をいえばこの値はクラス毎に異なった方が良いのですが、これはさほど重要ではありません。 乗数より素数の方がより好まれます。

パラメータ:
initialNonZeroOddNumber - 初期値として使用される0でない奇数
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
object - ハッシュコードを生成する対象となるオブジェクト
戻り値:
ハッシュコードの int
例外:
IllegalArgumentException - オブジェクトが null だった場合
IllegalArgumentException - 指定された数値が0または偶数だった場合

reflectionHashCode

public static int reflectionHashCode(int initialNonZeroOddNumber,
                                     int multiplierNonZeroOddNumber,
                                     Object object,
                                     boolean testTransients)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。

このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 testTransients 引数に true が設定された場合 transient メンバーを処理の対象とし、 false が設定された場合にはフィールドの値から取得されたものでオブジェクトの値とはならないとみなし、 transient メンバーを無視します。 static フィールドは処理の対象にはなりません。

2つのランダムに選ばれた0でない奇数の値を指定する必要があります。 理想をいえばこの値はクラス毎に異なった方が良いのですが、これはさほど重要ではありません。 乗数より素数の方がより好まれます。

パラメータ:
initialNonZeroOddNumber - 初期値として使用される0でない奇数
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
object - ハッシュコードを生成する対象となるオブジェクト
testTransients - transient フィールドを含めるかどうか
戻り値:
ハッシュコードの int
例外:
IllegalArgumentException - オブジェクトが null だった場合
IllegalArgumentException - 指定された数値が0または偶数だった場合

append

public HashCodeBuilder append(Object object)
Object をハッシュコードを生成するための対象に加えます。

パラメータ:
object - ハッシュコードに加えるオブジェクト
戻り値:
this

append

public HashCodeBuilder append(long value)
long をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える long の値
戻り値:
this

append

public HashCodeBuilder append(int value)
int をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える int の値
戻り値:
this

append

public HashCodeBuilder append(short value)
short をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える short の値
戻り値:
this

append

public HashCodeBuilder append(char value)
char をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える char の値
戻り値:
this

append

public HashCodeBuilder append(byte value)
byte をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える byte の値
戻り値:
this

append

public HashCodeBuilder append(double value)
double をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える double の値
戻り値:
this

append

public HashCodeBuilder append(float value)
float をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える float の値
戻り値:
this

append

public HashCodeBuilder append(boolean value)
boolean をハッシュコードを生成するための対象に加えます。

パラメータ:
value - ハッシュコードに加える boolean の値
戻り値:
this

append

public HashCodeBuilder append(Object[] array)
Object の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(long[] array)
long の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(int[] array)
int の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(short[] array)
short の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(char[] array)
char の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(byte[] array)
byte の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(double[] array)
double の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(float[] array)
float の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

append

public HashCodeBuilder append(boolean[] array)
boolean の配列をハッシュコードを生成するための対象に加えます。

パラメータ:
array - ハッシュコードに加える配列
戻り値:
this

toHashCode

public int toHashCode()
計算されたハッシュコードを返します。

戻り値:
処理の対象に加えられたフィールドを元にしたハッシュコードの int の値


このドキュメントは、Ja-Jakartaにより訳されました。 コメントがある場合は report@jajakarta.orgまでお願いします。
Translated into Japanese by jajakarta.org. The original page is here.
Copyright (c) 2002-2003 - Apache Software Foundation