Я знаю, что это уже давно, но я думал, что поставлю свои два цента.
Если вы программируете по контракту, объект не несет ответственности за ошибки другого объекта. Календарь реализует Cloneable, что означает, что подклассы тоже! Если подкласс Календаря разбивает контракт на Cloneable, необходимо подправить подкласс, а не клон вызова класса.
В программировании ОО объект должен заботиться только о классах &, с которыми он связан. Это усложняет дизайн значительно, по факторам, когда вы спрашиваете: «Что, если подкласс сломает его?» Всякий раз, когда объект принимает объект как параметр, всегда есть вероятность, что объект является подклассом и разбивает все. Вы программируете оборонительно, когда вы вызываете getX(), что он не генерирует исключение ArithmeticException для подклассов?
Jon Skeet предоставил отличный ответ, лучше, чем мой, но я подумал, что потенциальный споткнуться на этот вопрос может выиграть от прослушивания незначительной части «Дизайн по контракту». Хотя подход близок к смерти, методология помогла моим проектам спокойно много.
В чем проблема с клоном? (Мне действительно интересно) – zeller
Хорошая точка, клон клон хорош, если сам объект не расширяется, к сожалению, Calendar (GregorianCalendar) есть, но клон можно использовать, если я уверен, что объект является Календарем и никаким другим непослушным подклассом. На самом деле, я использую метод clone в getter того же класса, потому что я уверен, что мой внутренний календарь на самом деле таков. –
Вижу, вы правы. Но если объект относится к классу, который вы не хотите поддерживать, вы можете запретить его копирование, не так ли? – zeller