我需要全局声明一个Random实例。有没有更好的办法?

时间:2014-12-01 00:28:10

标签: java random

我有两个课程:BeingEnvironment。这两个类在某些时候都需要生成一个随机数。

最初,在需要随机数之前,我有一个Random的实例作为Environment的成员,我将其称为nextInt()。现在Being需要随机数字,而且我不确定最佳设置。

我的第一个想法是给BeingEnviro的每个实例提供Random的自己的实例,但这似乎很浪费。

然后我考虑在Environment中存储一个Random,并以某种方式将其传递给每个Being,但我认为我可能最终还是需要将它存储在每个实例中;所以它不会比第一个想法更好。

然后我想到用一个public static Random实例创建一个单独的类;但这意味着我只有2个类才能获得一个随机数(使用的随机类I' m实际上是随机的派生类)

最后,我想到全球宣布它。这留下了两个问题:

  • 我该怎么做?从我迄今为止从Java中看到的(我相当新的)来看,不可能有一个全局声明的对象实例。

  • 这是最好的解决方案吗?我还应该做些什么?

我不在乎可重复性,也不是SecureRandom。

3 个答案:

答案 0 :(得分:1)

拥有Random的多个实例并不浪费。我不这样做的唯一原因是,随机数是否需要为某种目的而重现。您没有提到想要控制随机种子或序列,因此您似乎只能拥有多个Random个实例。

答案 1 :(得分:0)

你可以用它。它是一个单例(意味着它可以随时拥有一个对象的最大值)。您可以使用静态方法获取实例:MyRandom random = MyRandom.getInstance();

    import java.security.SecureRandom;


public class MyRandom {
    final private static MyRandom singleton = new MyRandom();
    final private SecureRandom random = new SecureRandom();

    //it is important to keep this, so no one can make multiple instances of this class
    private MyRandom() {
    }

    final synchronized static public MyRandom getInstance() {
        return singleton;
    }
    final synchronized public int nextInt() {
        return random.nextInt();
    }
    final synchronized public long nextLong() {
        return random.nextLong();
    }
}

答案 2 :(得分:-1)

另一种方法是使用界面:

public interface MyRandom {
    static final SecureRandom random = new SecureRandom();
}

然后让您的BeingEnvironment类实现MyRandom接口