Koshkasobaka
@Koshkasobaka

Как работает метод clone() в java?

Здравствуйте. У меня есть несколько классов, содержащих методы transform(int[] board), меняющих по-разному массив. Они объединены одним интерфейсом (Transform). В Main создаю массив из объектов Transform и с помощью цикла хочу показать различные изменения массива, но чтобы это было наглядно, хочу чтобы изменения не накладывались друг на друга. Наставник дал мне подсказку, что надо использовать метод clone(). Я пробую передавать методам клон массива и тут начинается непонятное: первый метод вообще никак не изменяет массив. А дальше идут трансформации, которые наслаиваются друг на друга. Я не понимаю, как здесь правильно воспользоваться clone(), помогите пожалуйста!!
Transformer[] transformers = new Transformer[5];
        transformers[0] = new SwapBoardRows();
        transformers[1] = new SwapBoardColumns();
        transformers[2] = new SwapRegionsHorizontally();
        transformers[3] = new SwapRegionsVertically();
        transformers[4] = new SwapRowsAndColumns();

        for (int i = 0; i < transformers.length; i++) {
            transformers[i].transform(board.clone());
            for (int j = 0; j < board.clone().length; j++) {
                for (int k = 0; k < board.clone()[j].length; k++) {
                    System.out.print(board.clone()[j][k] + " ");
                }
                System.out.println();
            }
               System.out.println();
}
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
Bavashi
@Bavashi
Через метод .clone() не получится так сделать. Все дело в том, что когда вы передаете методу .clone() массив объектов, то он возвращает вам ссылки для нового (скопированного) массива, которые указывают на те же объекты исходного массива. Другими словами, вы будете через склонированный массив аффектить исходный массив с объектами. Источник.

Может наставник имел ввиду метод SerializationUtils.clone(array), который позволяет делать deep copy?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Kot1que
Каждый вызов clone() создаёт копию объекта. Следовательно вы на каждой итерации создаёте кучу клонов объекта board. Решение – вызвать clone() один раз, поместить результат в переменную и дальше с ней выполнять действия.

for (int i = 0; i < transformers.length; i++) {
            int[] clonedBoard = board.clone();
            transformers[i].transform(clonedBoard);
            for (int j = 0; j < clonedBoard.length; j++) {
                for (int k = 0; k < clonedBoard[j].length; k++) {
                    System.out.print(clonedBoard[j][k] + " ");
                }
                System.out.println();
            }
      System.out.println();
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы