Ham*_*uss 0 java random findbugs
我想摆脱FindBugs警告"DMI:随机对象创建并仅使用一次".在以下示例中,随机数仅在对象构造时生成一次.换句话说,对于类的单个实例的生命周期Wrap,java.util.Random将不会创建其他实例.有没有办法摆脱这个警告(除了添加注释),特别java.util.Random是在构造函数中实例化的情况下?
public final class Wrap {
/**
* Random generated double.
*/
private final double random;
/**
* Constructor.
*/
public Wrap() {
this.random = new Random().nextDouble();
}
public Double value() {
return this.random;
}
}
Run Code Online (Sandbox Code Playgroud)
您不应该在Random每次实例化类时创建新实例.这就是FindBugs警告告诉你的.完整的警告是(强调我的):
此代码创建一个
java.util.Random对象,使用它生成一个随机数,然后丢弃该Random对象.这产生了平庸的质量随机数并且效率低.如果可能,重写代码,以便Random创建对象并保存,每次需要新的随机数时,在现有Random对象上调用一个方法来获取它.如果重要的是,产生的随机数不是猜测的,你一定不是每个随机数创建一个新的随机的; 价值太容易猜到了.您应该强烈考虑使用
java.security.SecureRandom替代(并避免为所需的每个随机数分配新的SecureRandom).
为了避免警告,有几种可能性:
Random在你的班级中创造一个常数
private static final Random RANDOM = new Random();
Run Code Online (Sandbox Code Playgroud)
你在构造函数中重用的
this.random = RANDOM.nextDouble();
Run Code Online (Sandbox Code Playgroud)
这样,就不会创建新实例.
Math.random()因为你实际上想要一个0到1之间的随机双精度.使用该ThreadLocalRandom课程
this.random = ThreadLocalRandom.current().nextDouble(1);
Run Code Online (Sandbox Code Playgroud)
这也将在0和1之间返回随机双精度(不包括).