Java, реализующий клон, универсальный класс. - PullRequest
1 голос
/ 14 февраля 2010

У меня есть класс, который реализует 2Dtable. Элементы в таблице являются общими. И таблица хранится так:

public Object[][] list;

Проблема в том, что вызов клона для этого, очевидно, не работает. Обратите внимание, что мой тестовый набор инициализирует таблицу для хранения обычных целых чисел.

Tabell2D<Integer> en = new Tabell2D<Integer>(5,5);
        en.sett(0, 0, 55);
        Tabell2D<Integer> to = en.clone();
        to.sett(0, 0, 11);
        assertTrue(en.equals(to)); 

Здесь я делаю стол. Измени это, клонируй это. Поменяйте клона и сравните их. Очевидно, клон изменился. Несмотря на это, это утверждение верно.

Метод затмения генерирует равный метод:

public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Tabell2D other = (Tabell2D) obj;
        if (bredde == null) {
            if (other.bredde != null)
                return false;
        } else if (!bredde.equals(other.bredde))
            return false;
        if (høyde == null) {
            if (other.høyde != null)
                return false;
        } else if (!høyde.equals(other.høyde))
            return false;
        if (!Arrays.equals(liste, other.liste))
            return false;
        return true;
    }

Я предполагаю, что проблема либо в сравнении переменной list в равном, либо в методе клона. Метод клонирования:

public Tabell2D<E> clone(){
        Tabell2D<E> nyTab = new Tabell2D<E>(this.bredde,this.bredde);
        nyTab.liste = liste.clone(); 
        return nyTab; 
    }

Ответы [ 2 ]

2 голосов
/ 14 февраля 2010

Я думаю, что корень проблемы в том, что клонирование 2d-массива не идет глубоко. Если вам нужна глубокая копия liste, вам нужно написать собственный код для копирования каждой строки (или столбца в зависимости от того, как вы на это смотрите).

0 голосов
/ 14 февраля 2010

Клон должен вернуть объект.Ваш "клон" не перекрывает нормальный.

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

...