2010-02-21 2 views
4

Я никогда не видел, чтобы клон() применялся в любом реальном коде. Я читал об этом и чувствовал, что его использование может сделать код очень громоздким. Есть ли какой-либо конкретный прецедент для метода clone()? При каких обстоятельствах нужно будет использовать clone() и почему недостаточно использовать обычный конкструктор?use case for clone()

ответ

2

Джош Блох в Эффективной Java также не рекомендует использовать метод clone().

Есть несколько проблем с этим методом:

1) Если клонируемыми объект не только примитивные поля типа, но и объект поля, затем клонировали объект будет получать только ссылки на эти объекты, но не реальные клонированные объекты. Чтобы этого избежать, все внутренние объекты также должны быть клонируемыми.

2) Если вы создаете подкласс класса cloneable, то он также клонируется (даже если вы этого не хотите). Вот почему вы должны надлежащим образом переопределить метод clone(), чтобы избежать возможных проблем.

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

+0

Хмм ... это книга, которую я читаю в настоящее время. Все о методе выглядит грязным ... задавалось вопросом, почему это существует вообще – Aadith

+2

Первая версия Java была выпущена довольно быстро. Они проделали большую работу, и многие их решения были очень умными. Но они также допустили несколько ошибок, например, метод java.util.Date или clone(). Если он был добавлен один раз в API, они не могут его изменить. – Roman

+0

@Roman как насчет java.util.Date? почему это была ошибка? – Aadith

3

clone очень удобно делать защитные копии массивов, переданных методы или конструкторам (как и все типы массивов Cloneable, а подпись для clone() ковариантна так, что boolean[].clone() фактически возвращает boolean[], а не Object). Это единственное, действительно хорошее использование, которое я видел из этого за десять лет, хотя ...