I am reading the Java How to Program 10th edition and going through the first few chapters. For this example, we are show how to make sure of the SecureRandom class but there is a part which totally puzzles me.
// Fig. 6.8: Craps.java
// Craps class simulates the dice game craps.
import java.security.SecureRandom;
public class Craps
{
// create secure random number generator for use in method rollDice
private static final SecureRandom randomNumbers = new SecureRandom();
// enum type with constants that represent the game status
private enum Status { CONTINUE, WON, LOST };
// constants that represent common rolls of the dice
private static final int SNAKE_EYES = 2;
private static final int TREY = 3;
private static final int SEVEN = 7;
private static final int YO_LEVEN = 11;
private static final int BOX_CARS = 12;
// plays one game of craps
public static void main(String[] args)
{
int myPoint = 0; // point if no win or loss on first roll
Status gameStatus; // can contain CONTINUE, WON or LOST
int sumOfDice = rollDice(); // first roll of the dice
// determine game status and point based on first roll
switch (sumOfDice)
{
case SEVEN: // win with 7 on first roll
case YO_LEVEN: // win with 11 on first roll
gameStatus = Status.WON;
break;
case SNAKE_EYES: // lose with 2 on first roll
case TREY: // lose with 3 on first roll
case BOX_CARS: // lose with 12 on first roll
gameStatus = Status.LOST;
break;
default:
gameStatus = Status.CONTINUE; // game is not over
myPoint = sumOfDice; // remember the point
System.out.printf("Point is %d%n", myPoint);
break;
}
// while game is not complete
while (gameStatus == Status.CONTINUE) // not WON or LOST
{
sumOfDice = rollDice(); // roll dice again
// determine game status
if (sumOfDice == myPoint) // win by making point
gameStatus = Status.WON;
else if (sumOfDice == SEVEN) // lose by rolling 7 before point
gameStatus = Status.LOST;
}
// display won or lost message
if (gameStatus == Status.WON)
System.out.println("Player wins");
else
System.out.println("Player loses");
}
// roll dice, calculate sum and display results
public static int rollDice()
{
// pick random die values
int die1 = 1 + randomNumbers.nextInt(6); // first die roll
int die2 = 1 + randomNumbers.nextInt(6); // second die roll
int sum = die1 + die2; // sum of die values
// display results of this roll
System.out.printf("Player rolled %d + %d = %d%n", die1, die2, sum);
return sum;
}
} // end class Craps
From the book, it mentions that it is declared as private static final variable of the class, SecureRandom
so that that one object is always being used to call method, rollDice()
. If there were a program which contains multiple instance of class Craps
, they will all share this one object. My question is will there be a chance whereby multiple instances of class SecureRandom
will be needed? Next question will be since this is an object referenced variable of SecureRandom
, why is it still called as a variable of Craps
?
Next question will be since this is an object referenced variable of SecureRandom, why is it still called as a variable of Craps?
Your variable randomNumbers
is a member of Craps
class and it is of TYPE SecureRandom
. i.e. it is defined to be used as variable of Craps class which is of type SecureRandom
. It is defined as static means there will be only one copy of randomNumbers
and it will be shared by all instances of Craps