Java 如何以正确的方式为多个用途创建一个对象?

Java 如何以正确的方式为多个用途创建一个对象?,java,random,static,instance,factory,Java,Random,Static,Instance,Factory,当我在处理一个需要生成随机数的类时,我正在考虑一种方法,即只创建一个随机对象以供多种用途 我读过关于有效java中的静态工厂的文章,并提出了这一点,但是我想得越多,我在这里看到的逻辑就越少。这是最好的方式吗?这能确保只创建一个随机对象吗 public static Random newInstance() { return new Random(); } public static void generateRandom() { Random rand = newInstanc

当我在处理一个需要生成随机数的类时,我正在考虑一种方法,即只创建一个随机对象以供多种用途

我读过关于有效java中的静态工厂的文章,并提出了这一点,但是我想得越多,我在这里看到的逻辑就越少。这是最好的方式吗?这能确保只创建一个随机对象吗

public static Random newInstance() {
    return new Random();
}

public static void generateRandom() {
    Random rand = newInstance();
    //...
}
另一种方法是在构造函数中初始化它,尽管我不确定这是否是最佳实践

public static Random rand = new Random();

public static final SecureRandom rand=new SecureRandom()
这是最好的办法

每次调用
newInstance()
时,您都将构造一个新对象,这会产生开销,并以新种子重新开始

在您的
generateradom()
中,您的
rand
实例将位于该方法的局部范围,如果您只需要该方法的随机数生成器,这可能是更好的解决方案。这取决于你还在做什么

我倾向于将静态工厂用于逻辑比构建对象更复杂或更昂贵的情况。假设您要构造一个对象,然后从磁盘读取一些文件,并将这些数据加载到对象中。在静态工厂中这样做是很好的,因为您可以指定一些可能发生的异常(
IOException
),并且通常不希望构造函数是一个涉及读取文件之类的昂贵操作


公共静态最终SecureRandom rand=new SecureRandom()
这是最好的办法

每次调用
newInstance()
时,您都将构造一个新对象,这会产生开销,并以新种子重新开始

在您的
generateradom()
中,您的
rand
实例将位于该方法的局部范围,如果您只需要该方法的随机数生成器,这可能是更好的解决方案。这取决于你还在做什么

我倾向于将静态工厂用于逻辑比构建对象更复杂或更昂贵的情况。假设您要构造一个对象,然后从磁盘读取一些文件,并将这些数据加载到对象中。在静态工厂中这样做是很好的,因为您可以指定一些可能发生的异常(
IOException
),并且通常不希望构造函数是一个涉及读取文件之类的昂贵操作


公共静态最终SecureRandom rand=new SecureRandom()
这是最好的办法

每次调用
newInstance()
时,您都将构造一个新对象,这会产生开销,并以新种子重新开始

在您的
generateradom()
中,您的
rand
实例将位于该方法的局部范围,如果您只需要该方法的随机数生成器,这可能是更好的解决方案。这取决于你还在做什么

我倾向于将静态工厂用于逻辑比构建对象更复杂或更昂贵的情况。假设您要构造一个对象,然后从磁盘读取一些文件,并将这些数据加载到对象中。在静态工厂中这样做是很好的,因为您可以指定一些可能发生的异常(
IOException
),并且通常不希望构造函数是一个涉及读取文件之类的昂贵操作


公共静态最终SecureRandom rand=new SecureRandom()
这是最好的办法

每次调用
newInstance()
时,您都将构造一个新对象,这会产生开销,并以新种子重新开始

在您的
generateradom()
中,您的
rand
实例将位于该方法的局部范围,如果您只需要该方法的随机数生成器,这可能是更好的解决方案。这取决于你还在做什么

我倾向于将静态工厂用于逻辑比构建对象更复杂或更昂贵的情况。假设您要构造一个对象,然后从磁盘读取一些文件,并将这些数据加载到对象中。在静态工厂中这样做是很好的,因为您可以指定一些可能发生的异常(
IOException
),并且通常不希望构造函数是一个涉及读取文件之类的昂贵操作


如果您的应用程序是单线程的,则无需同步即可使用,但对于多线程环境,如果您想要单实例,则需要在
newInstanceMethod
中进行同步,或者您可以声明常量
private static final Random=new Random()
并从
静态方法返回它

请注意,
Random
类是线程安全的,不需要担心线程安全,但是您应该正确地遵循单例模式,以使您的应用程序在多线程环境中的运行时可以有单个
对象

这能确保只创建一个随机对象吗

public static Random newInstance() {
    return new Random();
}

public static void generateRandom() {
    Random rand = newInstance();
    //...
}
当前,您每次都返回新实例。如果您只想要一个实例,那么您可以拥有

private static final Random RANDOM = new Random()

public static Random newInstance() {
   return RANDOM;
}

如果您的应用程序是单线程的,而不是“是”,则可以在不同步的情况下使用,但对于多线程环境,如果您想要单实例,而不是在
newInstanceMethod
中需要同步,或者您可以声明常量
private static final Random=new Random()
并从
静态方法返回它

请注意,
Random
类是线程安全的,不需要担心