Reuse Random Objects in Java
What is it?
This practice focuses on reusing Random objects in Java. Creating new Random objects every time one is needed can lead to inefficient performance and potentially non-random values due to the repeated initialization of the seed from the current time.
Why apply it?
Reusing a single Random object across multiple uses can improve the efficiency of your code and ensure that the random values generated are more reliably random in their distribution.
How to fix it?
Define a single Random object for the class and store it as a field for reuse.
Examples
Example 1:
Negative
The negative example creates a new Random object every time the method is invoked, which is inefficient and potentially less random.
import java.util.Random;
public class Dice {
public int roll() {
Random random = new Random(); // Noncompliant
return random.nextInt(6) + 1;
}
public static void main(String[] args) {
Dice dice = new Dice();
System.out.println("Roll result: " + dice.roll());
}
}
Example 2:
Positive
The positive example demonstrates defining a Random object as a class field and reusing it within a method.
import java.util.Random;
public class Dice {
private Random random = new Random(); // Compliant
public int roll() {
return random.nextInt(6) + 1;
}
public static void main(String[] args) {
Dice dice = new Dice();
System.out.println("Roll result: " + dice.roll());
}
}
Negative
The negative example creates a new Random object within each method, leading to excessive object creation and lack of randomness.
import java.util.Random;
public class RandomUtil {
public static int getRandomNumber(int bound) {
Random random = new Random(); // Noncompliant
return random.nextInt(bound);
}
public static double getRandomDouble() {
Random random = new Random(); // Noncompliant
return random.nextDouble();
}
public static void main(String[] args) {
System.out.println("Random number: " + getRandomNumber(10));
System.out.println("Random double: " + getRandomDouble());
}
}
Example 3:
Positive
The positive example shows a scenario where a Random object is defined as a static field in a utility class and is reused in multiple methods.
import java.util.Random;
public class RandomUtil {
private static final Random random = new Random(); // Compliant
public static int getRandomNumber(int bound) {
return random.nextInt(bound);
}
public static double getRandomDouble() {
return random.nextDouble();
}
public static void main(String[] args) {
System.out.println("Random number: " + getRandomNumber(10));
System.out.println("Random double: " + getRandomDouble());
}
}