You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@directory.apache.org by Emmanuel Lecharny <el...@gmail.com> on 2007/10/27 23:03:49 UTC
[Return of the clones]
David Jencks wrote:
>
> On Oct 27, 2007, at 11:56 AM, Alex Karasulu wrote:
>
>> Hi Emmanuel, and others,
>>
>> I was taking another look at these ServerEntry interfaces etc and
>> noticed that you define
>> the clone() method as supported within the interfaces themselves.
>>
>> I may be wrong but I've always tried to avoid defining the clone()
>> method in interfaces and
>> have gone to great lengths to avoid using the clone() method. I
>> prefer to use factories or
>> constructors instead. For me the clone operation is scary and leads
>> to a lot of confusion.
>> Most of the time unless I have to support it because of a class I'm
>> extending I will deal with
>> it but when I can I try to avoid it.
>>
>> Emmanuel was wondering if you see supporting clone() as critical and
>> recommend we keep
>> it?
>>
>> I know just having a feeling is not enough to say using clone is
>> dangerous but I've always ran
>> into issues with it and the variance in the semantics to the point
>> where dealing with it was not
>> worth the trouble.
>>
>> Please could anyone with a clearer understanding of the pros and cons
>> provide some further
>> guidance on this topic?
>>
>
> I doubt I have a clearer understanding but Joshua Bloch's Effective
> Java has 8 pages pointing out how hard it is to write clone methods
> correctly and the problems they cause and how copy constructors or
> factory methods have much clearer semantics and implementations. I
> never feel like I know what is going to happen when I call clone :-)
Beside being the worst episode of Star Wars, I wouls say that clone is
not my favorite Java feature, but I used it a couple of times without
problems. The rules I have adopted were pretty simple : if it start to
be complex, stop using clone... In fact, when it's strait forward, like
you have a flat object, or a very simple inheritance scheme, clone() is
an option. Otherwise, a good factory or copy() constructor is the way to
go.
When performance is an issue, then clone may become a candidate, but
with a lot of caution...
E.clone() (or is it E.clown() ? ;)