Java是否有一个const引用等价物?

Java是否有一个const引用等价物?,java,c++,constants,Java,C++,Constants,下面是一段代码: //Game board is made up of Squares. A player can place GamePieces on a Square. public class CheckersBoard { public boolean PlaceGamePiece(GamePiece gamePiece, int nRow, int nColumn) { return m_theGameBoard[nR

下面是一段代码:

    //Game board is made up of Squares.  A player can place GamePieces on a Square.
    public class CheckersBoard
    {
        public boolean PlaceGamePiece(GamePiece gamePiece, int nRow, int nColumn) {
            return m_theGameBoard[nRow][nColumn].PlaceGamePiece(gamePiece);
        }

        private Square[][] m_theGameBoard;
    }
假设我正在测试PlaceGamePiece方法(使用junit),我需要访问m_theGameBoard,以便查看它并验证游戏是否放置在正确的正方形上,以及是否具有正确的数据

在C++中,我可以让测试类成为朋友,这样它就可以访问私有成员MyTeGeMead,或者我有一个函数返回一个不能修改的const游戏板(因为它是const):

现在我可以做任何我想在游戏板上做的检查,但我不能修改游戏板,因为它是常量

Java不支持返回常量引用或友元类。所以我的问题是,标准的Java方法是什么??我是否必须只提供一组get访问器,让我检查
方块上的数据

更新: 我最终按照Kaleb Brasee的建议编写了一个GetPiece方法

public GamePiece GetGamePiece(Point pt) {
    return new GamePiece(m_theGameBoard[pt.GetRow()][pt.GetColumn()]);
}
注意,我创建了一个新的游戏件对象并返回它。我不会返回gameboard内部参考,因此没有人可以修改gameboard,因为他们只有一个副本!美好的谢谢你们的帮助,一些非常好的建议


仅供参考:当我在这里发布对象时,我一直在更改它们的名称,如果这让任何人感到困惑,我很抱歉。

是的。您的选择基本上可以归结为:

Square getSquareAtLocation(int row, int col) { ... };
或者使用一个Java集合,然后您可以通过集合传递该集合

(请注意,如果使用多维列表,则必须小心包装内部列表,以确保它们也不可修改)


如果这只用于测试,您还可以创建一个函数,返回数组的深度副本。

将变量定义为受保护的,这样,如果单元测试在同一个包中,它就可以访问它


但是,我只需要添加一个公共方法
getPiece(introw,intcol)
,它返回该正方形上的片段(如果没有片段,则返回null)。您可能需要这样的方法,并且可以在测试中使用它。

方法或属性的默认访问修饰符为“package protected”,这意味着“仅在我的包中可见”。因此,您可以模拟“友谊”的语义,同时为测试维护一个单独的代码库,方法是拥有两个不同的源文件夹,但具有相同的包结构

src
|--com
    |
    --cchampion
         |
         --MyClass.java
tests
|--com
    |
    --cchampion
         |
         --TestMyClass.java
然后,在MyClass.java中

public class MyClass {
    private int nonTestedThing;
    int[][] testedThing;  // this is visible to TestMyClass
    // or
    // protected int[][] testedThing;
    // if you want it visible to kids
}

这在任何方面都不理想,但这是一种方法。

我的印象是,受保护与c的朋友是一样的。但是,如果一个使用board的类需要显示board上的所有片段(例如需要显示board上所有片段的GUI类),该怎么办--如果没有办法得到碎片,你怎么办?在我的国际象棋应用程序中,我有一个
Board.pieceOn(Square)
方法,如果有棋子,它将返回一个棋子;如果正方形为空,则返回null。返回一张被占用的方块地图,并将其映射为碎片,会更好吗?在给定图形上下文的情况下,为什么不让对象自己绘制呢?将
draw
方法添加到片段(或者每个片段的子类,如果您希望将UI代码分开的话)。我认为
board.draw(graphics)
piece.draw(graphics)
非常有意义。结合Holub在链接中概述的技术,您就有了一个很好的解决方案,可以避免破坏封装。
public class MyClass {
    private int nonTestedThing;
    int[][] testedThing;  // this is visible to TestMyClass
    // or
    // protected int[][] testedThing;
    // if you want it visible to kids
}