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

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

public class HashCodeBuilder
extends Object

HashCode を生成する処理です。

HashCode generation routines.

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

This class enables a good hashcode to be built for any class. It follows the rules laid out in the book Effective Java, by Joshua Bloch. Writing a good hashCode is actually quite difficult. This class aims to simplify the process.

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

All relevant fields from the object should be included in the hashCode. Derived fields may be excluded. In general, any field used in the equals method must be used in the hashCode method.

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

Typical use for the code is as follows:
 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 を使用します。 これは適切なパーミッションが設定されていない限り、セキュリティマネージャが稼動している状態では行うことができません。 また、この方法は明らかに低速です。

Alternatively, there is a method that uses reflection to determine the fields to test. Because these fields are usually private, the method, reflectionHashCode, uses Field.setAccessible to change the visibility of the fields. This will fail under a security manager, unless the appropriate permissions are set. It is also slower than testing explicitly.

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

A typical invocation for this method would look like:
 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
翻訳者:
日置 聡
翻訳状況:
初稿(校正者募集中)
翻訳更新日:
2003/08/18

フィールドの概要
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
ハッシュコードを作成する際に使用される定数。
Constant to use in building the hashCode


iTotal

private int iTotal
ハッシュコードの処理された総計。
Running total of the hashCode

コンストラクタの詳細

HashCodeBuilder

public HashCodeBuilder()
HashCodeBuilder のコンストラクタです。 このコンストラクタはハードコーディングされた2つの値をハッシュコードを生成する際に使用するために設定します。
Constructor for HashCodeBuilder. This constructor uses two hard coded choices for the constants needed to build a hashCode.


HashCodeBuilder

public HashCodeBuilder(int initialNonZeroOddNumber,
                       int multiplierNonZeroOddNumber)
HashCodeBuilder のコンストラクタです。 2つのランダムに選ばれた0でない奇数の値を指定する必要があります。 理想をいえばこの値はクラス毎に異なった方が良いのですが、これはさほど重要ではありません。 乗数より素数の方がより好まれます。
Constructor for HashCodeBuilder. Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class, however this is not vital. Prime numbers are preferred, especially for the multiplier.

パラメータ:
initialNonZeroOddNumber - 初期値として使用される0でない奇数
a non-zero, odd number used as the initial value
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
a non-zero, odd number used as the multiplier
例外:
IllegalArgumentException - 指定された数値が0または偶数だった場合
if the number is zero or even
メソッドの詳細

reflectionHashCode

public static int reflectionHashCode(Object object)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。
This method uses reflection to build a valid hash code.

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

It uses Field.setAccessible to gain access to private fields. This means that it will throw a security exception if run under a security manger, if the permissions are not set up. It is also not as efficient as testing explicitly. Transient members will be not be used, as they are likely derived fields, and not part of the value of the object. Static fields will not be tested. This constructor uses two hard coded choices for the constants needed to build a hash code.

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

reflectionHashCode

public static int reflectionHashCode(Object object,
                                     boolean testTransients)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。
This method uses reflection to build a valid hash code.

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

It uses Field.setAccessible to gain access to private fields. This means that it will throw a security exception if run under a security manger, if the permissions are not set up. It is also not as efficient as testing explicitly. If the TestTransients parameter is set to true, transient members will be tested, otherwise they are ignored, as they are likely derived fields, and not part of the value of the object. Static fields will not be tested. This constructor uses two hard coded choices for the constants needed to build a hash code.

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

reflectionHashCode

public static int reflectionHashCode(int initialNonZeroOddNumber,
                                     int multiplierNonZeroOddNumber,
                                     Object object)
このメソッドはハッシュコードを生成するためにリフレクションを使用します。
This method uses reflection to build a valid hash code.

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

It uses Field.setAccessible to gain access to private fields. This means that it will throw a security exception if run under a security manger, if the permissions are not set up. It is also not as efficient as testing explicitly. Transient members will be not be used, as they are likely derived fields, and not part of the value of the object. Static fields will not be tested.

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

Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class, however this is not vital. Prime numbers are preferred, especially for the multiplier.

パラメータ:
initialNonZeroOddNumber - 初期値として使用される0でない奇数
a non-zero, odd number used as the initial value
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
a non-zero, odd number used as the multiplier
object - ハッシュコードを生成する対象となるオブジェクト
the object to create a hash code for
戻り値:
ハッシュコードの int
int hash code
例外:
IllegalArgumentException - オブジェクトが null だった場合
if the object is null
IllegalArgumentException - 指定された数値が0または偶数だった場合
if the number is zero or even

reflectionHashCode

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

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

It uses Field.setAccessible to gain access to private fields. This means that it will throw a security exception if run under a security manger, if the permissions are not set up. It is also not as efficient as testing explicitly. If the TestTransients parameter is set to true, transient members will be tested, otherwise they are ignored, as they are likely derived fields, and not part of the value of the object. Static fields will not be tested.

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

Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class, however this is not vital. Prime numbers are preferred, especially for the multiplier.

パラメータ:
initialNonZeroOddNumber - 初期値として使用される0でない奇数
a non-zero, odd number used as the initial value
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
a non-zero, odd number used as the multiplier
object - ハッシュコードを生成する対象となるオブジェクト
the object to create a hash code for
testTransients - transient フィールドを含めるかどうか
whether to include transient fields
戻り値:
ハッシュコードの int
int hash code
例外:
IllegalArgumentException - オブジェクトが null だった場合
if the object is null
IllegalArgumentException - 指定された数値が0または偶数だった場合
if the number is zero or even

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

append

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

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

toHashCode

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

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


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