|
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectorg.apache.commons.lang.builder.HashCodeBuilder
HashCode を生成する処理です。
HashCode generation routines.このクラスはより良いハッシュコードをクラス内で生成する事を可能にします。 これは 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
を使用します。
これは適切なパーミッションが設定されていない限り、セキュリティマネージャが稼動している状態では行うことができません。
また、この方法は明らかに低速です。
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.このメソッドの一般的な使用方法は以下の様になります:
public boolean hashCode(Object o) {
return HashCodeBuilder.reflectionHashCode(this);
}
| フィールドの概要 | |
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 |
| フィールドの詳細 |
private final int iConstant
private int iTotal
| コンストラクタの詳細 |
public HashCodeBuilder()
public HashCodeBuilder(int initialNonZeroOddNumber,
int multiplierNonZeroOddNumber)
initialNonZeroOddNumber - 初期値として使用される0でない奇数
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
IllegalArgumentException - 指定された数値が0または偶数だった場合
| メソッドの詳細 |
public static int reflectionHashCode(Object object)
このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 transient メンバーは、おそらくフィールドの値から取得されたものでオブジェクトの値とはならないと考え、 処理の対象としません。 static フィールドは処理の対象にはなりません。 このメソッドはコンストラクタで設定された2つの定数をハッシュコードの生成に使用します。
object - ハッシュコードを生成する対象となるオブジェクト
IllegalArgumentException - オブジェクトが null だった場合
public static int reflectionHashCode(Object object,
boolean testTransients)
このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 testTransients 引数に true が設定された場合 transient メンバーを処理の対象とし、 false が設定された場合にはフィールドの値から取得されたものでオブジェクトの値とはならないとみなし、 transient メンバーを無視します。 static フィールドは処理の対象にはなりません。 このメソッドはハードコーディングされた2つの定数をハッシュコードの生成に使用します。
object - ハッシュコードを生成する対象となるオブジェクト
testTransients - transient フィールドを含めるかどうか
IllegalArgumentException - オブジェクトが null だった場合
public static int reflectionHashCode(int initialNonZeroOddNumber,
int multiplierNonZeroOddNumber,
Object object)
このメソッドは private フィールドの値を取得するために Field.setAccessible を使用します。 これはセキュリティマネージャが稼動していて、適切なパーミッションが設定されていない場合、 セキュリティ例外が投げられることを意味します。 このメソッドは明らかに非効率です。 transient メンバーは、おそらくフィールドの値から取得されたものでオブジェクトの値とはならないと考え、 処理の対象としません。 static フィールドは処理の対象にはなりません。
2つのランダムに選ばれた0でない奇数の値を指定する必要があります。 理想をいえばこの値はクラス毎に異なった方が良いのですが、これはさほど重要ではありません。 乗数より素数の方がより好まれます。
initialNonZeroOddNumber - 初期値として使用される0でない奇数
multiplierNonZeroOddNumber - 乗数として使用される0でない奇数
object - ハッシュコードを生成する対象となるオブジェクト
IllegalArgumentException - オブジェクトが null だった場合
IllegalArgumentException - 指定された数値が0または偶数だった場合
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 フィールドを含めるかどうか
IllegalArgumentException - オブジェクトが null だった場合
IllegalArgumentException - 指定された数値が0または偶数だった場合
public HashCodeBuilder append(Object object)
object - ハッシュコードに加えるオブジェクト
public HashCodeBuilder append(long value)
value - ハッシュコードに加える long の値
public HashCodeBuilder append(int value)
value - ハッシュコードに加える int の値
public HashCodeBuilder append(short value)
value - ハッシュコードに加える short の値
public HashCodeBuilder append(char value)
value - ハッシュコードに加える char の値
public HashCodeBuilder append(byte value)
value - ハッシュコードに加える byte の値
public HashCodeBuilder append(double value)
value - ハッシュコードに加える double の値
public HashCodeBuilder append(float value)
value - ハッシュコードに加える float の値
public HashCodeBuilder append(boolean value)
value - ハッシュコードに加える boolean の値
public HashCodeBuilder append(Object[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(long[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(int[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(short[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(char[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(byte[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(double[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(float[] array)
array - ハッシュコードに加える配列
public HashCodeBuilder append(boolean[] array)
array - ハッシュコードに加える配列
public int toHashCode()
|
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||