使用实例变量的静态方法

时间:2015-11-19 14:54:07

标签: java

所以answer,Scary Wombat,在this问题上,他说我们应该将创建的Random对象保留为字段而不是方法,但我已经在网上看到很多次类似方法是静态的。所以我的问题是,为什么将类似的方法设置为静态,即使该方法使用的是实例变量 - 在这种情况下是随机的?

2 个答案:

答案 0 :(得分:0)

如果方法是静态的,则不能使用该实例变量,因为Scary Wombat在他的回答中解释在短时间内创建的随机对象将产生不均匀分布的PRN(尽可能多)。因此,如果将Random对象存储为实例变量,并且创建此对象的次数较少,并且您继续使用相同的实例,这将为您提供更均匀分布的PRN流。

答案 1 :(得分:0)

有以下几个主要原因:

  1. 对象的构造很昂贵并且会降低静态方法的性能。这可能不适用于Random,但是有理由缓存该对象。请记住,使用的对象函数应该是线程安全的,因为可以同时从不同的线程调用静态方法。

  2. 您只需要一个对象实例。这可能就像一个单例(一个实例),或者您只是想减少函数使用的内存并避免分配多个实例。

  3. Random在构造过程中被初始化,它是伪随机的。这意味着如果使用相同的种子初始化它将返回相同的值。因此,对函数进行多次并行调用可以构造一个具有相同随机数序列的Random实例。

  4. 要注意:我检查了原因3的源代码,但对于JDK 8中的Random实现,情况并非如此,因为它包含seedUniquifier函数,它以线程安全的方式生成随机种子。也许Scary Wombat没有意识到这一点。