在Java中使用静态变量的优点

Nik*_*ita 3 java random static

假设我有两个这样的类:

class A{  
    private static Random random = new Random();  

    public A(){  
        // Do something.
    }

    public Integer methodGetsCalledQuiteOften(){
        return random.nextInt();
    }
}

class B{  
     private Random random;  

     public A(){  
         random = new Random();
         // Do something.
     }

     public Integer methodGetsCalledQuiteOften(){
         return random.nextInt();
     }
}
Run Code Online (Sandbox Code Playgroud)

在两个实例化多次实例化并且这两个类'实例'方法methodGetsCalledQuiteOften都被调用很多的情况下,使用在类A 中保存的静态变量是否存在任何真正的优点/缺点(时间,内存),Random()而不是Random()在每个实例中创建一个新对象,就像在B类中一样?

该应用程序是多线程的,随机性更高,所以我认为我将使用静态SecureRandom.如果在分析后这将是一个真正的速度因素,我可能会选择其他东西.

Mar*_*ers 6

真正的优点/缺点取决于真实的代码.换句话说,它取决于B创建a的频率与调用方法的频率等相比.您应该分析您的应用程序并查看它是否有合理的差异.

A会比B更高效吗?当然.但是,你是否会注意到取决于你的用法.A会比B使用更少的内存吗?当然,但你是否关心取决于你要保留多少个A/B实例.

真正唯一的另一个考虑因素是决定论.由于您没有为Random实例指定种子,我认为您不关心是否可以从Random重现数字序列.但是值得注意的是......如果你有一个共享的随机数,那么为某个A实例保证某个确定性数字序列要比在每个实例中保存一个确定性数字序列要困难得多.


Tom*_*ine 5

对可变的静态说不,m'kay.

这是一个残酷的设计.通常引用的结果是可测试性失败.没有重新加载课程就很难重现.由于许多其他原因,糟糕的设计也很糟糕.仅举一例,默认情况下,类应与线程无关.添加一个可变的静态,你是线程敌对的 - 一个不好的地方.

每次创建一个新实例似乎都很浪费.当然,虽然不过早优化(如果你正在优化,你就不会使用java.util.Random).初始看到递增也可能导致问题.

最好的方法是传入一个实例("Parameterise from Above"或"正确使用构造函数").然后你可以测试,复制,模拟等.你是高效的,可以翻转不同的实现.