Объект клонов и знание базового объекта в ссылке (JAVA) - PullRequest
1 голос
/ 15 мая 2011

Я пытаюсь написать исходник на основе концепции симуляции "Game Of Life".Я создал класс, представляющий состояние игровой среды, но отделил логику функции-преемника в другом классе.Состояние игры сохраняется в простом многомерном массиве логических значений.

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

Я не уверен, что происходит, поэтому я не могу отладить должным образом.Я более привык к обработке C # клонов примитивных типов.

Вот мой код для класса-оболочки функции-преемника:

открытый класс Successor {

boolean[][] current_state;
public void next(WorldPopulation worldState){
    int dim_x = worldState.get_width();
    int dim_y = worldState.get_height();
    boolean[][] nextstate = worldState.get_state();
    current_state = worldState.get_state().clone();
    for(int i=0; i<dim_y; i++){
        for(int j=0; j<dim_x; j++){
            int neighbors = 0;
            neighbors = countThyNeighbors(i, j);
            if((neighbors>3 || neighbors<3) && current_state[i][j]){
                nextstate[i][j] = false;
            } else if(!current_state[i][j] && neighbors>=3) { nextstate[i][j] = true; }
        }
    }
}
private int countThyNeighbors(int y, int x) {
    int[] grid_x = { x-1, x, x+1, x-1, x+1, x-1, x, x+1};
    int[] grid_y = { y-1, y-1, y-1, y, y, y+1, y+1, y+1};
    int neighbors = 0;
    for(int i=0; i<8; i++){
        try{
        if(current_state[grid_y[i]][grid_x[i]])
            neighbors++;
        } catch(Exception e) { continue;}
    }
    return neighbors;
}

}

Функции get () и set () в классе WorldPopulation являются просто операциями присваивания и возврата.

Я немного знаком с нюансами клонирования (глубокие и неглубокие клоны) из фона C #, но я совершенно новый в парадигмах Java.

Любые предложения по улучшению моего кода очень ценятся, но я хочу знать, что происходит и что я делаю неправильно.Большое спасибо!: D

1 Ответ

1 голос
/ 15 мая 2011

Многомерные массивы представлены в виде массивов массивов.Метод клонирования в Java неглубокий.это означает, что многомерный массив не клонируется глубоко.

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

...