全局java对象

时间:2016-01-13 04:58:58

标签: java

我正在编写一个生成随机数的程序。在我的每个方法中,我创建了一个对象,它在每个方法中执行相同的操作,并且每次都给它指定相同的名称。这是不好的做法吗?将它作为这样的全局对象包含它会更好:

import java.util.Random;
public class RandomNumbers {

Random rand = new Random();

public int random() {
    int result;
    result = rand.nextInt(100) + 1;
    return result;  
}

public int topNumber(int firstTopNumber){
    int result;
    result = rand.nextInt(firstTopNumber) + 1;
    return result;
}

而不是:

import java.util.Random;
public class RandomNumbers {

public int random() {
    int result;
    Random rand = new Random();
    result = rand.nextInt(100) + 1;
    return result;  
}

public int topNumber(int firstTopNumber){
    int result;
    Random rand = new Random();
    result = rand.nextInt(firstTopNumber) + 1;
    return result;
}

2 个答案:

答案 0 :(得分:1)

将全局变量用于此类目的没有问题。实际上你的方法不是static所以你不会声明一个全局对象,只是一个成员变量。但我假设这些方法应该是静态的,因为它们是实用方法,那么私有static final variable是一件好事(并且避免在每次调用时重新接种序列),例如:

class RandomNumbers {
  private final static Random r = new Random();

  public static int topNumber(int firstTopNumber) {
   return r.nextInt(firstTopNumber) + 1;
  }
}

请注意,多个方法之间共享的变量(static或不是)并不总是一件好事,在这种情况下,你有一个无状态对象(实际上它有状态,但它无关紧要)所以从任何方法使用它不是问题,但情况并非总是如此。

答案 1 :(得分:0)

在使用成员变量之前,应检查以下内容。

  1. 实例变量的类型应该是线程安全的(Random是线程安全的)或者应该同步access或方法。
  2. 2.Cross检查API文档。请参阅以下https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

    中的引文
      

    java.util.Random的实例是线程安全的。但是,跨线程并发使用相同的java.util.Random实例可能会遇到争用并因此导致性能不佳。请考虑在多线程设计中使用ThreadLocalRandom。