java中的toString函数存在问题(使用局部变量)

java中的toString函数存在问题(使用局部变量),java,Java,我在java程序中有一个类,在这个类中我使用toString函数来检索数据。toString检查同一类中返回int值的私有函数,以显示不同类型的返回消息~ 问题是,如果我在字符串函数中使用局部变量,结果都是好的,但是如果我直接在if语句中检查私有函数,则该函数不会返回任何值 private int computerTryHorizontalPlay() { int repeatedMyValueCount = 0; int repeatedYourValueCo

我在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() {

        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;
    }
}
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;
}

想想在每种情况下调用了多少次
computerTryHorizontalPlay
。您不工作的版本多次调用
computerTryHorizontalPlay()
。第一次修改它正在查看的数据,以便下次可以给出不同的结果。这将是一个很好的开关使用,而不是多个if-else-if-else语句,不管这为什么不起作用。
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;
}