(Dirigido a un público un poco diferente ahora, supongo ...)
me gustaría utilizar clone()
si absolutamente necesario utilizar Calendar
en absoluto (en lugar de Joda Time). Usted argumenta en comentarios que está preocupado por una "subclase traviesa": ¿cómo propondría trabajar en eso en cualquier esquema? Si no sabe nada acerca de las subclases involucradas, y no confía en ellas, entonces no tiene forma de preservar los datos específicos del tipo. Si no confías en la subclase para no complicar las cosas, en general tienes problemas más grandes. ¿Cómo confía en que le proporcione los resultados correctos al realizar los cálculos de fecha/hora?
clone()
es la manera esperada de la clonación de objetos: es donde yo esperaría un sensata subclase para enganchar en cualquier comportamiento específico del tipo que necesitaba. No necesita saber qué partes del estado son relevantes; simplemente deje que el tipo se ocupe de eso.
Beneficios sobre el uso y configuración de propiedades Calendar.getInstance()
mismo:
- podrás conservar el mismo tipo de calendario
- Usted no tiene que preocuparse por olvidar propiedades: Es la responsabilidad del tipo
- Estás diciendo explícitamente lo que quieres hacer, y dejando que la implementación se ocupe de cómo, lo que siempre es bueno. Tu código expresa tu intención exactamente.
EDIT: En términos de la "intercalación de rosca", que las preocupaciones acerca de la pregunta original: el valor del parámetro date
no cambiarán lo hacen otros hilos. Sin embargo, si otro hilo está mutando el contenido del objeto mientras toma una copia defensiva, ese podría muy fácilmente causar problemas. Si eso es un riesgo, entonces tienes problemas mayores, básicamente.
¿Cuál es el problema con clonar? (Estoy realmente interesado) – zeller
Buen punto, Sí, el clon es bueno si el objeto en sí mismo no es extensible, desafortunadamente Calendar (GregorianCalendar) sí lo es, pero el clon podría usarse si estoy seguro de que el objeto es un calendario y ninguna otra subclase maliciosa. De hecho, estoy usando el método de clonación en el getter de la misma clase porque estoy seguro de que mi calendario interno es de hecho eso. –
Ya veo, tienes razón. Pero si el objeto es de una clase que no quieres admitir, podrías prohibir su copia, ¿verdad? – zeller