[jbosscache-dev] New collections

Jason T. Greene jason.greene at redhat.com
Fri Aug 8 13:15:18 EDT 2008


Manik Surtani wrote:
> 
> On 7 Aug 2008, at 05:35, Jason T. Greene wrote:
> 
>> Manik Surtani wrote:
>>> On 5 Aug 2008, at 14:42, Jason T. Greene wrote:
>>>>>>
>>>>>> What I would like to do, provided everyone is ok with this, is 
>>>>>> switch this code to static factory methods like so:
>>>>>>
>>>>>> Immutables.immutableCopy(Map map);
>>>>>> Immutables.immutableCopy(List list);
>>>>>> Immutables.immutableCopy(Set set);
>>>>>>
>>>>>> These will then just call clone and Collections.unmodifiableXXX as 
>>>>>> appropriate. We can then add optimizations later if they become 
>>>>>> available.
>>>>> Would these be more generic, to suit any collection 
>>>>> implementation?  Remember that not all Maps, for example, implement 
>>>>> Cloneable or have a copy constructor.  And wrapping any Map passed 
>>>>> in as a FastCopyHashMap may break correctness, for example, if a 
>>>>> SortedMap were passed in.
>>>>
>>>> Right, they would use instanceof to check all the known map types as 
>>>> a fast-path optimization. After that it would check for cloneable, 
>>>> and use reflection to invoke clone. It would then look for a copy 
>>>> constructor, and failing that it would then create a different 
>>>> collection type. We could for example, in the case of a non-copyable 
>>>> SortedMap, use a TreeMap, and order is maintained.
>>> Right yes, you would need the logic in place to do this.
>>> -- 
>>
>> Ok, today I went ahead and made these changed (commit 6536). So in 
>> case anything breaks, you know why :) I did run through the unit tests 
>> locally though, with no failures.
> 
> I think it did break a few things - see the tests in 
> o.j.c.notifications.  :-)

Ok, I'll take a look at those. I remember them passing for me before.

> Also, looking at Immutables.immutableMapCopy(), isn't it inefficient 
> that you attempt to call clone() using reflection, catch exceptions on 
> failure, then try a copy constructor, catch exception on failure, and 
> finally attempt a new HashMap()?  Given that this would most likely be 
> used with either a FastCopyHashMap or a HashMap, shouldn't we just check 
> for instanceof of these types and use the copy constructor directly, 
> especially given that there is hardly any performance diff between 
> FCHM.clone() and it's copy constructor?

Yeah I was originally planning on doing a instanceof check on known 
types, I just forgot to commit that update. It is using clone though.

> Cloneable is such an arse interface - they really should have exposed 
> clone() as a public method there.  Solves a lot of problems, no need for 
> reflection, etc.

Yeah I agree it's a screwed up design.

-- 
Jason T. Greene
JBoss, a division of Red Hat



More information about the jbosscache-dev mailing list