Зачем вам объявлять переменную ссылки на объект static final?

Я читаю Java Как программировать 10-е издание и прохожу первые несколько глав. В этом примере мы покажем, как убедиться в классе SecureRandom, но есть часть, которая меня полностью озадачивает.

// 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

Из книги упоминается, что она объявлена ​​как частная статическая конечная переменная класса, SecureRandom так что этот один объект всегда используется для вызова метода, rollDice(), Если бы была программа, которая содержит несколько экземпляров класса Craps, они все будут разделять этот один объект. У меня вопрос, будет ли шанс, что несколько экземпляров класса SecureRandom будут необходимы? Следующий вопрос будет, поскольку это объектная переменная SecureRandomпочему он до сих пор называется переменной Craps?

1 ответ

Решение

Следующий вопрос будет, поскольку это переменная SecureRandom, на которую ссылаются объекты, почему она все еще называется переменной Craps?

Ваша переменная randomNumbers является членом Craps класс и это типа SecureRandom, т.е. он определен для использования в качестве переменной класса Craps, который имеет тип SecureRandom, Он определяется как статический, значит, будет только одна копия randomNumbers и это будет распространяться на все случаи Craps

Другие вопросы по тегам