By the looks of it - BeanUtils.copyProperties
seems to create a clone of an object. If this is the case, and what with the concerns around implementing the Cloneable interface (Only immutable objects are new where as mutable objects have references copied) which is the best and why?
I yesterday implemented cloneable and then realised I had to provide my own modifications for non String/Primative elements. I was then informed about BeanUtils.copyProperties
which I am now using. Both implementations seem to provide a similar functionality.
Thanks
Josh Bloch provides some fairly good arguments (including the one you provided) asserting that Cloneable
is fundamentally flawed, favoring a copy constructor instead. See here.
I haven't yet encountered a practical use case for copying an immutable object. You're copying objects for a specific reason, presumably to isolate some set of mutable objects into a single transaction for processing, guaranteeing nothing can alter them until that unit of processing is complete. If they're already immutable then a reference is as good as a copy.
BeanUtils.copyProperties
is often a less intrusive way of copying without having to alter your classes to be supported, and it offers some unique flexibility in compositing objects.
That said, copyProperties
is not always one-size-fits-all. You may at some point need to support objects containing types that have specialized constructors, but are still mutable. Your objects can support internal methods or constructors to work around those exceptions, or you can register specific types into some external tool for copying, but it can't reach some places that even clone()
can. It's good, but still has limits.