Java имеет стандартный эквивалент константы?

Вот отрывок кода:

    //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, или у меня была бы функция, которая возвращает константу GameBoard, который не может быть изменен (потому что это - константа):

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

Теперь я могу сделать, какую когда-либо проверку я хочу сделать на игровой доске, но я не могу изменить игровую доску, потому что это - константа.

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

ОБНОВЛЕНИЕ: Я закончил тем, что писал метод GetPiece как предложенный Kaleb Brasee.

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

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

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

9
задан cchampion 28 January 2010 в 18:31
поделиться

3 ответа

Определите переменную в виде защищенных , так что если тест устройства находится в том же пакете, он может получить доступ к нему.

Тем не менее, я бы просто добавил общественный метод оздоровительный метод (int Row, Int Col) , который возвращает кусок на этом квадрате (или NULL, если там нет части). Вероятно, вам все равно понадобится такой метод, и вы можете использовать его в тестах.

3
ответ дан 4 December 2019 в 23:39
поделиться

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

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
}

Это не идеально в любом отношении, но это один из способов пойти об этом.

2
ответ дан 4 December 2019 в 23:39
поделиться

Да. Ваш выбор в основном кипеет вниз, чтобы либо имел:

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

или использование одного из коллекций Java, которые вы могли бы пройти через Collections.unModiFialeList (...)

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

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

1
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: