2016-01-13 55 views
1

我正在写一个程序,它会生成随机数。在我的每个方法中,我都创建了一个对象,它在每个方法中执行相同的操作,并且每次都给它一个相同的名称。这是不好的做法吗?它会更好,以它作为这样一个全局对象:全球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; 
} 
+0

你的第一个场景不使用“全局”对象(在Java中没有全局范围的变量),但它确实避免了每次需要一个数字时都必须重新实例化一个新的随机对象。所以我更喜欢第二种情况。 –

回答

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或不)总是一件好事,在这种情况下,你有一个无状态的对象(实际上它有状态,但它是无关的),所以从任何方法使用它不是一个问题,但情况并非总是如此。

0

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

  1. 实例变量的类型应该是线程安全的(Random是线程安全的),或者应该同步访问或方法。

2.跨API检查文档。请参见下面的报价https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

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