Пример эффективной Java, где clone() возвращает неполную копиюJAVA

Программисты JAVA общаются здесь
Anonymous
Пример эффективной Java, где clone() возвращает неполную копию

Сообщение Anonymous »

В третьем издании «Эффективной Java» Джошуа Блох рассказывает о том, как следует реализовывать метод клонирования в сложных объектах.

Код: Выделить всё

public class SimpleHashtable implements Cloneable {
private Entry[] buckets;
private int size;

private static class Entry {
final K key;
V value;
Entry next;

Entry(K key, V value, Entry next) {
this.key = key;
this.value = value;
this.next = next;
}

// Recursively clone the linked list of entries
Entry deepCopy() {
return new Entry(key, value, next == null ? null : next.deepCopy());
}
}

public SimpleHashtable() {
buckets = new Entry[16]; // Default size
}

@Override
public SimpleHashtable clone() {
try {
@SuppressWarnings("unchecked")
SimpleHashtable result = (SimpleHashtable) super.clone();
result.buckets = new Entry[buckets.length];
for (int i = 0; i < buckets.length; i++) {
result.buckets[i] = buckets[i] != null ? buckets[i].deepCopy() : null;
}
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
Записи в сегментах будут ссылаться на объекты, отличные от исходных. Однако я думаю, что ключ и значение будут ссылками на те же объекты, что и в оригинале. Что, если клонированная хеш-таблица изменит значение данного ключа, то это изменение будет отражено в оригинале. В результате у нас действительно получается поверхностный текст.
Я что-то упустил или пример неверный?

Подробнее здесь: https://stackoverflow.com/questions/784 ... allow-copy

Вернуться в «JAVA»