использовать случай для клона () - PullRequest
4 голосов
/ 21 февраля 2010

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

Ответы [ 2 ]

3 голосов
/ 21 февраля 2010

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

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

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

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

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

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

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

...