2016-01-13 86 views
1

我正在寫一個程序,它會生成隨機數。在我的每個方法中,我都創建了一個對象,它在每個方法中執行相同的操作,並且每次都給它一個相同的名稱。這是不好的做法嗎?它會更好,以它作爲這樣一個全局對象:全球Java對象

import java.util.Random; 
public class RandomNumbers { 

Random rand = new Random(); 

public int random() { 
    int result; 
    result = rand.nextInt(100) + 1; 
    return result; 
} 

public int topNumber(int firstTopNumber){ 
    int result; 
    result = rand.nextInt(firstTopNumber) + 1; 
    return result; 
} 

的這個代替:

import java.util.Random; 
public class RandomNumbers { 

public int random() { 
    int result; 
    Random rand = new Random(); 
    result = rand.nextInt(100) + 1; 
    return result; 
} 

public int topNumber(int firstTopNumber){ 
    int result; 
    Random rand = new Random(); 
    result = rand.nextInt(firstTopNumber) + 1; 
    return result; 
} 
+0

你的第一個場景不使用「全局」對象(在Java中沒有全局範圍的變量),但它確實避免了每次需要一個數字時都必須重新實例化一個新的隨機對象。所以我更喜歡第二種情況。 –

回答

1

有使用全局變量像這樣一個目的沒有問題。其實你的方法不是static所以你不會聲明一個全局對象,只是一個成員變量。但我猜想,這些方法應該是靜態的,因爲它們是實用方法,那麼私人static final variable是一件好事(並避免在每次調用時再接種順序),如:

class RandomNumbers { 
    private final static Random r = new Random(); 

    public static int topNumber(int firstTopNumber) { 
    return r.nextInt(firstTopNumber) + 1; 
    } 
} 

記住,一個變量在多種方法之間共享(static或不)總是一件好事,在這種情況下,你有一個無狀態的對象(實際上它有狀態,但它是無關的),所以從任何方法使用它不是一個問題,但情況並非總是如此。

0

在使用成員變量之前,應檢查以下內容。

  1. 實例變量的類型應該是線程安全的(Random是線程安全的),或者應該同步訪問或方法。

2.跨API檢查文檔。請參見下面的報價https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

java.util.Random的實例是線程安全的。但是,跨線程併發使用相同的java.util.Random實例可能會遇到爭用並導致性能下降。考慮在多線程設計中使用ThreadLocalRandom。