Java 可以将随机对象声明为私有静态最终属性吗?

Java 可以将随机对象声明为私有静态最终属性吗?,java,performance,Java,Performance,我有以下课程: 公共类卡片生成器{ 私有静态最终随机=新随机(); 私人卡生成器(){ } 公共静态长生成器枚举器(){ int identifier=random.nextInt(1_000_000_000-100_000_000+1) +100_000_000;//9位数字 长数=400_000*1_000_000_000L +标识符;//15位 int checksum=Luhn.getChecksum(数字); number=number*10+校验和;//16位 返回号码; } 公共静

我有以下课程:

公共类卡片生成器{
私有静态最终随机=新随机();
私人卡生成器(){
}
公共静态长生成器枚举器(){
int identifier=random.nextInt(1_000_000_000-100_000_000+1)
+100_000_000;//9位数字
长数=400_000*1_000_000_000L
+标识符;//15位
int checksum=Luhn.getChecksum(数字);
number=number*10+校验和;//16位
返回号码;
}
公共静态int generatePIN(){
返回random.nextInt(10_000-1_000+1)+1_000;//4位数字
}
}
或者在每种方法中创建一个新的随机对象更好吗?

“更好”总是取决于您的确切要求

需要考虑的事项:

  • 您是否希望您的代码是可测试的(以上仅在一定程度上)
  • 您是否希望您的代码在多线程环境中工作,以及不同的线程是否应该看到相同的随机数
换句话说,不同的非答案是:您必须理解代码将用于的合同。然后你可以决定什么是合适的


在“单次运动后扔掉”的水平上,以上可能是可以的,但不是更多。

你可能会想,生成一个新的随机对象可能会产生更多的数字,呃,随机的。但事实并非如此。调用
next()
始终会更改用于创建随机数的种子

protected int next(int bits) { // is called by nextInt()
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}
因此,每次创建一个新的随机对象并没有什么优势,但性能稍差,因为您总是在创建一个新对象


所以,是的,只使用一个随机对象是完全可以的。

这能回答你的问题吗?也不我认为最好不要创建
java.util.Random
。对于高性能RNG,请使用。对于加密强RNG,请使用。