4

そのため、ソース コードを調べていたところ、静的変数Math.javaを保持するために作成されたホルダー クラスがあることがわかりました。randomNumberGenerator関連するコードは次のとおりです。

public final class Math {
 // other methods.
 public static double random() {
   return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
 }

 private static final class RandomNumberGeneratorHolder {
   static final Random randomNumberGenerator = new Random();
 }
}

IMO、クラス自体の中で単にrandomNumberGeneratorasを宣言することもできました。private static finalMath

私の質問は、これのために別のホルダークラスを作成する利点はありますか? または、それは単なる個人的な好みです。

4

4 に答える 4

10

これは、初期化オンデマンド ホルダー パターンの例です。Mathクラスが JVM によってロードされるとき、Randomインスタンスはすぐには構築されません。代わりに、メソッドが呼び出されたときにのみ発生し、random()その時点でRandomNumberGenreatorHolderクラスがロードされ、Randomシングルトン オブジェクトが構築されます。

基本的に、コードはRandomシングルトンが遅延して作成されることを保証しています。

于 2018-08-17T10:54:23.843 に答える
3

これは、ネストされたクラスを使用して実装される遅延初期化シングルトンの例です。

「ホルダー」は、最初にrandom()呼び出されたときに初期化されます。RandomNumberGeneratorHolder最初の呼び出しは、クラスの静的初期化の実行をトリガーします。

(これを怠惰に行うことは価値があります。シードを提供せずに乱数ジェネレーターを初期化すると、ジェネレーターをシードするための「エントロピー」を取得するために OS に行く必要があります。これは比較的高価な操作です。JVM にそのコストを負担させたくありません。 ifrandom()は呼び出されません。)

于 2018-08-17T10:54:06.370 に答える