(нацелен на немного другую аудиторию, я думаю ...)
Я бы использовал clone()
, если бы мне вообще пришлось использовать Calendar
(вместо Joda Time). В комментариях вы утверждаете, что беспокоитесь о «непослушном подклассе» - как бы вы предложили обойти это в схеме любая ? Если вы ничего не знаете о задействованных подклассах и не доверяете им, то у вас нет способа сохранить специфичные для типа данные. Если вы не доверяете подклассу, чтобы не испортить вещи, у вас есть большие проблемы в целом. Как вы доверяете ему, чтобы дать вам правильные результаты при выполнении расчетов даты / времени?
clone()
- это ожидаемый способ клонирования объектов: именно здесь я ожидал бы, что разумный подкласс зацепит любое поведение, зависящее от типа, в котором оно нуждается. Вам не нужно знать, какие биты состояния имеют отношение - вы просто позволяете типу разобраться с этим самим.
Преимущества по сравнению с Calendar.getInstance()
и настройкой свойств самостоятельно:
- Вы сохраните тот же тип календаря
- Вам не нужно беспокоиться о том, чтобы забыть свойства: это ответственность типа
- Вы явно говорите , что вы хотите сделать, и позволяете реализации позаботиться о how , что всегда приятно. Ваш код точно выражает ваше намерение.
РЕДАКТИРОВАТЬ: С точки зрения «чередования потоков», о котором беспокоится исходный вопрос: значение date
параметра не изменит независимо от того, что делают другие потоки. Однако, если другой поток изменяет содержимое объекта, пока вы берете защитную копию, это может очень легко вызвать проблемы. Если это риск, то у вас больше проблем, в основном.