2013-01-05 23 views
3

我想創建一個隨機的int值在多個類中使用。每次創建這些類的一組新實例時,我都希望將這個新的隨機int值用於所有這些類。隨機值應該是相同的。你將如何在許多課程中分享隨機值?

所以簡而言之,我想要創建一個隨機索引並在跨多個一起工作的類中使用以生成數據。

這個隨機值應該在堆棧頂部生成,並且在每個正在一起工作的類中靜態調用?

回答

6

只需創建一個包含隨機值字段的類。提供一個getter方法來訪問它。然後,爲每個新批次的課程分享這個類的新實例。

E.g.

private static final Random random = new Random(); 
private final int randomValue = random.nextInt(); 

... 

public int getRandomValue() { 
    return randomValue; 
} 

這樣,隨機數對於每組類都是相同的,但對於每個組是不同的。

+0

AOL情況下是由修道院用於常量的離子,其中「Random」不是。 –

+0

太棒了!這非常有幫助!如果有一個類正在生成這組類的所有新實例,該怎麼辦?我應該在該課程中創建相同的場景嗎? –

+0

@ TomHawtin-tackline取決於你如何定義「常量」。即使對象的狀態是可變的,只要對象引用的值保持不變,將其與Java中的「static final」等同即可。 (用C++的說法,'* const'和'const *'之間的區別。) – millimoose

1

大約是這樣的

static class Utility { 
    private static final int variable = (int)Math.round(1000*Math.random()); 

     public static int getVariable() { 
      return variable; 
     } 
} 

它就像Math.PI等 例如什麼

System.out.println(Utility.getVariable()); 
+1

難以進行單元測試,如果這是您的包包。 –

1

只要將其傳遞到相關對象在它們的構造函數:

class Main { 
    public static void main() { 
     Random rnd = new Random(); 
     for (...) { 
      int index = rnd.nextInt(); 
      // one set of related instances 
      Foo f = new Foo(index); 
      Bar b = new Bar(index); 
     } 
    } 
} 

class Foo { 
    int randomIndex; 
    public Foo(int randomIndex) { 
     this.randomIndex = randomIndex; 
     // etc. 
    } 
} 

class Bar { ... } 

如果你想有一個值是一個類的實例之間的不同(是否同時或不存在),不要」讓它靜止

1

首先物化「組」的你在談論的概念,通過使用專用類,將與各組相關的元數據:

class Group 
{ 
    private int index = -1; 

    public Group(int index) 
    { 
     this.index = index; 
    } 

    public int getIndex() 
    { 
     return index; 
    } 
} 

然後分配給每個班的組信息的數據。

如果您知道每個對象實例化之前的索引,請使用構造函數。 請注意,工廠模式可以幫助您封裝實例化過程(如果它很複雜)。

如果你知道它後面仍然有機會獲得實例使用專用的方法:

public void assignToGroup(Group group) 

如果您沒有訪問實例了,那麼你可以使用一些簡單的反轉:每個實例會要求它的組:

getMyGroup(this) 

到外部的方法:

public Group getMyGroup(MyClass instance) 
{ 
    // ... some complex logic to determine the right group based on the instance state ... 
}