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,请使用。