2010-03-23 15 views
24

Estoy tratando de hacer una copia profunda de un objeto, incluida una instancia GregorianCalendar. Siempre tengo cuidado con el uso de clone() y no parece haber sido anulado aquí, así que solo estoy haciendo el campo de copiado por campo. Idealmente, no habría un constructor de copia, que podría utilizar de este modo:Forma más rápida de clonar un calendario Gregorian?

GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar); 

Lamentablemente no puedo encontrar ninguna dicha funcionalidad en el API y estoy atascado tratando de averiguar qué campos que necesito para obtener una copia exacta. Entonces, para hacer una copia de uno de estos calendarios, ¿cómo lo harías? ¿Me falta algún atajo simple aquí?

Respuesta

36

java.util.Calendar ha reemplazado clone() que funciona, por lo que úselo. Además, Calendar no tiene una jerarquía de datos profunda; sus datos son principalmente int s.

Para extender la respuesta, puede llamar SerializationUtils.clone(..) (de commons-lang) en cualquier objeto que haga una copia en profundidad, si toda la jerarquía de datos implementa Serializable

+0

que no era del todo claro por qué estoy evitando 'clon()'. En este caso, estoy siguiendo los consejos de Joshua Bloch para hacer copias defensivas. Como clone() podría estar llamando a un método de clonación de subclase(), podría terminar con una copia no limpia. Un poco académico en mi caso, pero es por eso que lo estaba evitando. – wds

+0

como dije, los datos en el Calendario no se ven afectados por este problema, todos sus datos son primitivos. Y el método de clonación en 'Calendar' funciona bien. – Bozho

+0

Su punto es que podría concebiblemente crear una subclase que mantenga una referencia a la instancia de calendario original y mantenga esa referencia a su alrededor. Si, por ejemplo, todos los establecedores establecerían valores en la instancia original en lugar de la nueva, su copia "profunda" ahora se verá comprometida. – wds

-7

Uh, clone() chupa.

¿Es tan difícil? Solo tiene que establecer 3 cosas, creo, la hora, la zona horaria y la configuración regional. Todos esos campos tienen getters y setters. Haga un método de utilidad bastante para devolver una copia?

+0

No entiendo; ya que tanto Calendar como GregorianCalendar implementan métodos de clonación personalizados, ¿por qué no sería apropiado usarlos? –

+0

Falacia de la dureza. Los buenos programadores son flojos. –

0

Específicamente, la línea más rápida de código para copiar un calendario es:

GregorianCalendar newCalendar = (Calendar)(oldCalendar.clone()); 
Cuestiones relacionadas