Am 19.03.2012 05:53, schrieb Sean Chou:
Hi Ulf,
    I hope following comments can help reduce your concern.


I don't think this footprint is a problem until it is proved to be one. If it is, a better javac can be used to save this footprint, and it would save much more. The actual problem might be reached by http://openjdk.java.net/jeps/149 .
As I have no setup here now, I cna't proove it, sorry, but: Many a mickle makes 
a muckle.


        With the if statement, it reads "put a null after the elements if there are 
more space",
        while with your code, it reads "copy all the elements from r or copy 
all elements and 1
        more from r if there are more space" and we have to think "what's the 
next element in r ?
        ". In fact, we need look back to find how r is defined "T[] r = a.length 
>= size ? a :
        (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), 
size);" and go
        through the code once more to realize there is a null at that position.

    Yes, a better comment would be necessary.

A comment just help understand the code, does not remove this thinking.
Well, but only if one doesn't believe it ;-)

However, 7153238 is a RFE and this is a bug. I would like the bug to be fixed in a way easy to understand if possible. And you can put all the enhancement in the RFE which in fact would do much more then this piece of byte code footprint saving. It is better to do one thing in one bug/RFE.
Agreed!

    But you could reuse it (like Object[] res) with:
    Map<String,Object> map = new TConcurrentHashMap<>(); // better: TCHM1
    ...
    map = new TConcurrentHashMap2<>();
    I agree, a little nit, but I had the other "missing" test cases in mind, 
where the numbering
    then could become confusing.

The comment"// Check less elements" and " // Check equal elements" clearly describe the two blocks of code are testing different scenarios. And a new definition would emphasize it is a different variable, it is used to test different scenarios.
With same justification you could have: a1, a2, res1, res2 instead reusing a, 
res.

    I would not like to add "// inherits from AbstractCollection.toArray()" , 
it is obvious and
    listed in java doc.

    In ConcurrentHashMap.values:
       Overrides: values in class AbstractMap<K,V>
    In AbstractMap.values:
       This implementation returns a collection that subclasses 
AbstractCollection.
    But there is no guarantee, that the returned collection overrides or just 
delegates to
    AbstractCollection.toArray().
    In worst case, t.j.u.AC.ToArray doesn't test j.u. 
AbstractCollection.toArray() at all.

Do you mean ConcurrentHashMap returns a collection does not inherit AbstractCollection ? Don't worry about that, ConcurrentHashMap is a class of java collection framework, it won't let that happen. AbstractCollection is born to be inherited, especially by collection classes in java collection framework.
Yes, it is born to be inherited, and one day someone could override AbstractCollection.toArray() in the implementation of the subclassed collection returned by AbstractMap.values() without violating the given spec. In this case, your test would test the subclassed collection's toArray() method, but not AbstractCollection.toArray().

-Ulf

Reply via email to