Есть ли в Java эквивалент ссылки на const? - PullRequest
9 голосов
/ 28 января 2010

Вот фрагмент кода:

    //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, чтобы я мог посмотреть на него и убедиться, что GamePiece был помещен на правильный квадрат и имеет правильные данные.

В C ++ я бы либо сделал тестовый класс другом, чтобы он мог получить доступ к закрытому члену m_theGameBoard, либо получил бы функцию, которая возвращает const GameBoard, который нельзя изменить (потому что он const):

const GameBoard& GetGameBoard() const { return m_theGameBoard; }

Теперь я могу делать то, что проверяю на игровом поле, но я не могу изменить игровое поле, потому что оно постоянное.

Java не поддерживает возврат константных ссылок или классов-друзей. Итак, мой вопрос, что является стандартным способом Java сделать это ?? Должен ли я просто предоставить несколько методов доступа get, которые позволяют мне проверять данные на Square?

UPDATE: Я закончил тем, что написал метод GetPiece, как предложил Калеб Брейз.

public GamePiece GetGamePiece(Point pt) {
    return new GamePiece(m_theGameBoard[pt.GetRow()][pt.GetColumn()]);
}

Обратите внимание, я создаю новый объект GamePiece и возвращаю его. Я не возвращаю внутреннюю ссылку на GameBoards, поэтому никто не может изменять игровую доску, потому что у них есть только копия! Ницца! Спасибо за помощь, ребята, очень хороший совет.

К вашему сведению: я продолжаю менять названия объектов, когда выкладываю их здесь, извините, если это кого-то смутило.

Ответы [ 3 ]

3 голосов
/ 28 января 2010

Определите переменную как protected, чтобы, если модульный тест был в том же пакете, он мог получить к нему доступ.

Однако я бы просто добавил публичный метод getPiece(int row, int col), который возвращает фигуру в этом квадрате (или ноль, если там нет фигуры). Вероятно, вам все равно понадобится такой метод, и вы сможете использовать его в своих тестах.

2 голосов
/ 28 января 2010

Модификатор доступа по умолчанию для метода или свойства является «защищенным пакетом», что означает «видимый только в моем пакете». Следовательно, вы можете эмулировать семантику «дружбы», сохраняя при этом отдельную базу кода для тестов, имея две разные исходные папки, но с одинаковой структурой пакета.

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
}

Это не идеально во всех отношениях, но это один из способов.

1 голос
/ 28 января 2010

Да. Ваш выбор в основном сводится к тому, чтобы иметь:

Square getSquareAtLocation(int row, int col) { ... };

или с использованием одной из коллекций Java, которую можно затем передать через Collections.unmodifiableList (...)

(обратите внимание, что если вы использовали многомерный список, вам также нужно быть осторожным, чтобы обернуть внутренние списки, чтобы убедиться, что они также не модифицируются)

Если это когда-либо будет использоваться только для тестирования, вы также можете создать функцию, которая возвращает глубокую копию массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...