Java 使用实例变量的静态方法

Java 使用实例变量的静态方法,java,Java,关于这个问题,可怕的袋熊说,我们应该把创建的随机对象作为一个场,而不是在方法中,但我在网上见过很多次类似的方法是静态的。所以我的问题是,为什么即使方法使用了一个实例变量(在这种情况下是随机的),也要将类似的方法设置为静态的做法呢?如果方法是静态的,就不能使用该实例变量,正如可怕的袋熊在他的回答中解释的那样,在短时间内创建的随机对象将产生不尽可能均匀分布的PRN。因此,如果您将随机对象存储为实例变量,并且该对象的创建较少,并且您继续使用相同的实例,这将为您提供更均匀分布的PRN流。主要原因如下:

关于这个问题,可怕的袋熊说,我们应该把创建的随机对象作为一个场,而不是在方法中,但我在网上见过很多次类似的方法是静态的。所以我的问题是,为什么即使方法使用了一个实例变量(在这种情况下是随机的),也要将类似的方法设置为静态的做法呢?

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

主要原因如下:

对象的构造非常昂贵,并且会降低静态方法的性能。对于Random,这可能不是真的,但可以证明缓存该对象是正确的。请记住,使用的对象函数应该是线程安全的,因为静态方法可能同时从不同的线程调用

您只需要对象的一个实例就可以了。这可能类似于单个实例,或者您只想减少函数使用的内存,避免分配多个实例

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


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

我想你是误解了。如果随机变量作为实例变量添加,则调用它的方法不能是静态的。方法将变为非静态,或者字段将变为静态。请阅读评论Random rand=new Random;我甚至可以说那一定是一块田地。在短时间内创建的随机对象往往会产生类似的输出。在短时间内调用randInt的次数如此之多,无法提供均匀分布的输出因此,这意味着,一次又一次地重新创建随机对象。然后,由随机对象生成的数字就不再是随机的了。开始谈论“原因3”的并不是可怕的袋熊。此外,如果这个问题在JDK中不是问题,那么它仍然值得一提。