He aquí un fragmento de código:¿Java tiene un equivalente de referencia constante?
//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;
}
Digamos que estoy probando el método PlaceGamePiece (utilizando JUnit) y necesito para acceder al m_theGameBoard para que pueda mirarlo y verificar la gamepiece fue colocado en la correcta Square y tiene los datos correctos.
En C++ Me o bien hacer la clase de prueba un amigo para que pueda acceder al miembro de m_theGameBoard privada, o que tendría una función que devuelve un GameBoard const que no puede ser modificada (porque es const):
const GameBoard& GetGameBoard() const { return m_theGameBoard; }
Ahora puedo hacer lo que quiera comprobar que quiero hacer en el tablero de juego, pero no puedo modificar el tablero porque es const.
Java no admite el retorno de referencias de referencias o clases de amigos. Entonces mi pregunta es ¿cuál es la forma estándar de Java de hacer esto? ¿Debo simplemente proporcionar un conjunto de accesadores get que me permitan verificar los datos en el Square
?
ACTUALIZACIÓN: Terminé escribiendo un método GetPiece como sugirió Kaleb Brasee.
public GamePiece GetGamePiece(Point pt) {
return new GamePiece(m_theGameBoard[pt.GetRow()][pt.GetColumn()]);
}
Aviso Creo un nuevo objeto GamePiece y lo devuelvo. No devuelvo la referencia interna de GameBoards, por lo tanto, nadie puede modificar el tablero porque solo tienen una copia. ¡Bonito! Gracias por la ayuda chicos, algunos consejos realmente buenos.
FYI: Sigo cambiando los nombres de los objetos cuando los publico aquí, lo siento si eso confundió a alguien.
Tengo la impresión de que proteger es lo mismo que el amigo de c. – Karl
Pero, ¿qué ocurre si una clase que trabaja con el tablero necesita mostrar todas las piezas del tablero (como una clase de GUI que necesita mostrar todas las piezas en el tablero)? ¿Cómo harías sin un método para obtener piezas? En mi aplicación de ajedrez, tengo un método 'Board.pieceOn (Square)' que devuelve una Pieza si hay alguna Pieza presente, o nula si la Plaza está vacía. ¿Sería mejor devolver un mapa de cuadrados ocupados mapeados a Pieces? –
http://www.javaworld.com/javaworld/jw-01-2004/jw-0102-toolbox.html ¿Por qué no se dibujan los objetos, dado un contexto gráfico? Agregue un método 'dibujar' a las piezas (o una subclase de cada pieza, si prefiere mantener el código de UI separado). Creo que 'board.draw (graphics)' and 'piece.draw (graphics)' tiene mucho sentido. Combina esto con la técnica de Holub descrita en el enlace y tienes una buena solución que evita romper la encapsulación. –