当我正在开发一个需要随机数生成的类时,我正在考虑一种方法来创建一个Random对象以供多种用途。
我在有效的java中读到静态工厂并提出了这个问题,但我想的越多,我在这里看到的逻辑就越少。这是最好的方法吗?这是否确保只创建一个Random对象?
public static Random newInstance() {
return new Random();
}
public static void generateRandom() {
Random rand = newInstance();
//...
}
另一种方法是在构造函数中初始化它,虽然我不确定这是否是最佳实践?
public static Random rand = new Random();
答案 0 :(得分:2)
public static final SecureRandom rand = new SecureRandom();
将是最好的方式去。
每当你打电话给你的newInstance()
时,你就要构建一个新的对象,这会导致开销并重新开始使用新的种子。
在您的generateRandom()
中,您的rand
实例将是该方法范围的本地实例,如果您只需要该方法的随机数生成器,这可能是更好的解决方案。这取决于你还在做什么。
我倾向于使用静态工厂来处理逻辑比构造对象更复杂或更昂贵的情况。假设您要构造一个对象,然后从磁盘读取一些文件并将该数据加载到该对象中。这在静态工厂中是很好的,因为你可以指定一些可能发生的异常(IOException
),并且通常不期望构造函数是一个昂贵的操作,涉及读取文件之类的东西。
答案 1 :(得分:1)
如果您的应用程序是单线程而不是是,则可以在没有同步的情况下使用singleton pattern,除此之外,如果您需要单个实例而不是需要在newInstanceMethod
中进行同步,那么对于多线程环境则可以也可以通过private static final Random = new Random()
static
方法声明常量newInstance
并返回它。
请注意,Random
类是线程安全的,不需要担心线程安全,但是您应该正确遵循单例模式,以使您的应用程序在运行时可以在Object >多线程环境。
这是否确保只创建一个Random对象?
目前,您每次都会返回新实例。如果您只想要单个实例,那么。
private static final Random RANDOM = new Random()
public static Random newInstance() {
return RANDOM;
}