Проблема в функции toString в Java (работает с локальной переменной) - PullRequest
0 голосов
/ 03 июля 2019

У меня есть класс в Java-программе, где я использую функцию toString для получения данных. toString проверяет приватную функцию в том же классе, которая возвращает значение типа int, для отображения различных типов возвращаемых сообщений. ~

Проблема в том, что если я использую локальную переменную в строковой функции, то все получается хорошо, но если я проверяю в операторах if непосредственно частную функцию, эта функция не возвращает никакого значения.

private int computerTryHorizontalPlay() {

        int repeatedMyValueCount = 0;
        int repeatedYourValueCount = 0;
        int[] myPositions = new int[3];
        int[] yourPositions = new int[3];

        for (int a = 0; a < 3; a++) {
            int repeatedMyValue = 0;
            int repeatedYourValue = 0;
            int emptyFields = 0;
            int[] emptyPosition = new int[2];
            for (int b = 0; b < 3; b++) {
                if (jogoGalo[a][b] == 'X') {
                    repeatedMyValue++;
                } else if (jogoGalo[a][b] == 'O') {
                    repeatedYourValue++;
                }
                if (jogoGalo[a][b] == '-') {
                    emptyPosition[0] = a;
                    emptyPosition[1] = b;
                    emptyFields++;
                }
            }

            if (repeatedMyValue == 3 || repeatedYourValue == 3) {
                return 3;
            } else {
                if (emptyFields == 1) {
                    if (repeatedMyValue == 2) {
                        repeatedMyValueCount++;
                        myPositions[repeatedMyValueCount - 1] = emptyPosition[0];
                        myPositions[repeatedMyValueCount] = emptyPosition[1];
                    } else if (repeatedYourValue == 2) {
                        repeatedYourValueCount++;
                        yourPositions[repeatedYourValueCount - 1] = emptyPosition[0];
                        yourPositions[repeatedYourValueCount] = emptyPosition[1];
                    }
                }
            }
        }

        if (repeatedMyValueCount > 0) {
            jogoGalo[myPositions[0]][myPositions[1]] = 'X';
            return 2;
        } else if (repeatedYourValueCount > 0) {
            jogoGalo[yourPositions[0]][yourPositions[1]] = 'X';
            return 1;
        }

        return 0;
    }

Это не работает!

    public String toString() {
        if(computerTryHorizontalPlay() == 3) {
            return "The game has already ended!";
        }
        else if(computerTryHorizontalPlay() == 2) {
            return "Computer won!";
        }
        else if(computerTryHorizontalPlay() == 1) {
            return "Computer defendeu!";
        }
        return null;
    }

Это работает!

public String toString() {

        int horizontalFunctionValue = computerTryHorizontalPlay();

        if(horizontalFunctionValue == 3) {
            return "The game has already ended!";
        }
        else if(horizontalFunctionValue == 2) {
            return "Computer won!";
        }
        else if(horizontalFunctionValue == 1) {
            return "Computer defendeu!";
        }
        return null;
    }
}

1 Ответ

1 голос
/ 03 июля 2019

toString() должен быть методом только для чтения, то есть запрещается иметь побочные эффекты, такие как изменение состояния объекта. Поскольку computerTryHorizontalPlay() является методом с изменением состояния, вам не разрешено вызывать его с toString().

Поскольку единственное изменение состояния происходит в последнем операторе if, вы можете изменить код, чтобы он не выполнял воспроизведение при вызове из toString(), например:

private int computerTryHorizontalPlay() {
    return computerTryHorizontalPlay(true);
}

private int computerTryHorizontalPlay(boolean doMove) {

    // lots of code here

    if (repeatedMyValueCount > 0) {
        if (doMove)
            jogoGalo[myPositions[0]][myPositions[1]] = 'X';
        return 2;
    } else if (repeatedYourValueCount > 0) {
        if (doMove)
            jogoGalo[yourPositions[0]][yourPositions[1]] = 'X';
        return 1;
    }

    return 0;
}

public String toString() {
    if(computerTryHorizontalPlay(false) == 3) {
        return "The game has already ended!";
    }
    else if(computerTryHorizontalPlay(false) == 2) {
        return "Computer won!";
    }
    else if(computerTryHorizontalPlay(false) == 1) {
        return "Computer defeated!";
    }
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...