在构造函数中创建Random时,摆脱FindBugs"只创建一次使用的随机对象"

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)

Tun*_*aki 8

您不应该在Random每次实例化类时创建新实例.这就是FindBugs警告告诉你的.完整的警告是(强调我的):

此代码创建一个java.util.Random对象,使用它生成一个随机数,然后丢弃该Random对象.这产生了平庸的质量随机数并且效率低.如果可能,重写代码,以便Random创建对象并保存,每次需要新的随机数时,在现有Random对象上调用一个方法来获取它.

如果重要的是,产生的随机数不是猜测的,你一定不是每个随机数创建一个新的随机的; 价值太容易猜到了.您应该强烈考虑使用java.security.SecureRandom替代(并避免为所需的每个随机数分配新的SecureRandom).

为了避免警告,有几种可能性: