2016-04-24 82 views
0

我想擺脫FindBugs警告「DMI:Random對象創建並僅使用一次」。在下面的例子中,隨機數只在對象構造時生成一次。換句話說,對於Wrap類的單個實例的生命週期,將不會創建其他java.util.Random實例。有沒有辦法擺脫這個警告(除了添加註釋),特別是在構造函數中實例化了java.util.Random的情況下?在構造函數中創建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:

  • 創建類恆定Random

    private static final Random RANDOM = new Random(); 
    

    您在構造函數中重複使用

    this.random = RANDOM.nextDouble(); 
    

    這樣,沒有新的insta nces被創建。

  • 使用Math.random()因爲你想有效的隨機雙ThreadLocalRandom類使用0和1之間
  • this.random = ThreadLocalRandom.current().nextDouble(1); 
    

    ,也將返回0和1(不含)之間的隨機雙。

相關問題