2016-04-24 4 views
0

FindBugsの警告「DMI:ランダムオブジェクトを作成して一度しか使用しない」を取り除きたい。次の例では、乱数はオブジェクト構築時に一度だけ生成されます。つまり、クラスWrapの単一インスタンスのライフサイクルでは、他のインスタンスjava.util.Randomは作成されません。具体的にjava.util.Randomがコンストラクタでインスタンス化されている場合に、この警告(アノテーションを追加する以外)を取り除く方法はありますか?FindBugsを取り除くコンストラクタでランダムが作成されたときに「ランダムオブジェクトを作成して一度だけ使用する」

public final class Wrap { 

    /** 
    * Random generated double. 
    */ 
    private final double random; 

    /** 
    * Constructor. 
    */ 
    public Wrap() { 
     this.random = new Random().nextDouble(); 
    } 

    public Double value() { 
     return this.random; 
    } 

} 
+0

'Random'を保存するか、' Wrap' *コンストラクタ*に渡します。 –

答えて

7

クラスがインスタンス化されるたびに、Randomという新しいインスタンスを作成しないでください。これは、FindBugsの警告があなたに伝えるものです。 The full warning is(強調鉱山):

このコードは、java.util.Randomオブジェクトを作成し、一個の乱数を生成するためにそれを使用し、その後Randomオブジェクトを破棄する。 これは、普通の品質の乱数を生成し、非効率的です。可能であれば、Randomオブジェクトが一度作成されて保存されるようにコードを書き換え、新しい乱数が必要になるたびに既存のRandomオブジェクトのメソッドを呼び出して取得します。

生成された乱数を推測できないことが重要な場合は、の乱数ごとに新しい乱数を作成する必要があります。値はあまりにも容易に推測できます。代わりにjava.security.SecureRandomを使用することを強く検討する必要があります(必要な乱数ごとに新しいSecureRandomを割り当てるのは避けてください)。

警告を回避するには、いくつかのpossibiliesがあります

  • は、あなたのクラスであなたが

    this.random = RANDOM.nextDouble(); 
    
    でコンストラクタ内で再利用

    private static final Random RANDOM = new Random(); 
    

    を一定のRandomを作成します

    この方法では、新しいinstaはありませんncesが作成されます。

  • 使用Math.random()あなたが効果的にも(排他)、0と1の間のランダムなダブルを返します

    this.random = ThreadLocalRandom.current().nextDouble(1); 
    

    ThreadLocalRandomクラスを使用し

  • 0と1の間のランダムな二重にしたいからです。