通过引用更新对象(数独)

时间:2013-03-21 21:35:27

标签: java oop object pass-by-reference

我有一个Sudoku难题解算器,需要我们使用递归..问题是我的布尔值来检查可用空间是否应该通过引用更新当前位置而不是。会导致这种情况的原因是什么?

    public boolean solve()
{
    Coordinate current = new Coordinate(); 

    if (findEmptyGridSlot(current)) {   // THE ERROR IS HERE **********  THIS IS SHOWING (0,0) STILL ******************

        for (int number = 1; number <= 9; number++)  
            if (canPlaceNumber(current, number)) { 
                grid[current.getRow()][current.getColumn()] = number; 

                if (solve()) 
                    return true; 

                grid[current.getRow()][current.getColumn()] = 0; 
            } return false;
    }else
        return true;

}

private boolean findEmptyGridSlot(Coordinate coordinate)
{
    boolean found = false;

    try{
        while (!found) 
        {
            if (grid[coordinate.getRow()][coordinate.getColumn()] == 0)
                found = true;
            else
                coordinate = coordinate.next(); // *****This is supposed to update the current coordinate ******
        }
    }catch (Exception e){
        //CREATE No Empty Cells Exception
    } 
    return found;
}

public Coordinate next()
{
    Coordinate result = new Coordinate(row, column);

    result.column++;
    if (result.column > MAX_COORDINATE)
    {
        result.column = MIN_COORDINATE;
        result.row++;
        if (result.row > MAX_COORDINATE) result = null;
    }

    return result;
}

2 个答案:

答案 0 :(得分:1)

Java按值传递。这意味着您将获得参考坐标的副本。如果将该副本指向新对象(即coordinate = coordinate.next),则只更改本地副本。现在,另一方面,如果您更改了变量引用的对象的属性(例如coordinate.x = foocoordinate.setX(foo)),则该方法的调用者可以看到该更改。

答案 1 :(得分:1)

jpm是正确的,但我第一次误读了,所以我要尝试清晰

private boolean findEmptyGridSlot(Coordinate coordinate)

引用按值传递。用这些术语来思考“坐标”是一个装有一张纸的盒子,在纸上写下一个地址。坐标是一个只属于这种方法的盒子,它有自己的一张纸(许多纸上可能写有相同的地址)

我们可以在这个框中查看并将“发布”到写在纸上的地址,但是当我们说

coordinate=something

这意味着在一张新纸上写下“某事”的地址。扔掉那张旧纸。

这个动作绝不会影响第一张纸上有地址的原始“房子”。当我的朋友乔恩更新他的地址簿时,无论他写什么都没关系,我仍然住在我的家里。

因此,如果坐标具有一些简单的子结构(例如x和y),则可以“发布”指令以将x和y更改为等于“下一个”。

或者作为一个黑客,你可以将一个坐标包含在另一个对象中,这样你就可以发一条指令给它改变hack类指向的内容

评论中提到的测试代码:

public class Test {

    public static void main(String args[]){
        String bareMinObject="start";
        changeString(bareMinObject);
        System.out.println(bareMinObject); //Prints start, change string has no effect

    }

    public static void changeString(String input){
        String temp="end";
        input=temp;

    }

}