On 6 Jan 2014, at 18:11, Chris Hegarty <chris.hega...@oracle.com> wrote:

> On 6 Jan 2014, at 17:05, Martin Buchholz <marti...@google.com> wrote:
> ……..
>> 
>> In a sane language, the AbstractFoo classes would be traits - they should 
>> never contribute to the *specification* of a concrete class, only to its 
>> implementation.  Therefore,  in Java, all of the methods should have 
>> precisely an {@inheritDoc} followed by an @implSpec.  In particular, for 
>> AbstractCollection.toArray I see:
>> 
>> 114     /**
>> 115      * {@inheritDoc}
>> 116      *
>> 117      * <p>This method is equivalent to:
>> 118      *
>> 119      *  <pre> {@code
>> 120      * List<E> list = new ArrayList<E>(size());
>> 121      * for (E e : this)
>> 122      *     list.add(e);
>> 123      * return list.toArray();
>> 124      * }</pre>
>> 125      *
>> 126      * @implSpec
>> 127      * This implementation returns an array containing all the elements
>> 128      * returned by this collection's iterator, in the same order, stored 
>> in
>> 129      * consecutive elements of the array, starting with index {@code 0}.
>> 130      * The length of the returned array is equal to the number of 
>> elements
>> 131      * returned by the iterator, even if the size of this collection 
>> changes
>> 132      * during iteration, as might happen if the collection permits
>> 133      * concurrent modification during iteration.  The {@code size} 
>> method is
>> 134      * called only as an optimization hint; the correct result is 
>> returned
>> 135      * even if the iterator returns a different number of elements.
>> 136      */
>> 137     public Object[] toArray() {
>> 
>> which must be wrong.  Either the sample code should be moved into the 
>> @implSpec or promoted to Collection.java.toArray.  The introduction of 
>> default methods ("not quite traits") makes the situation murkier.  Looking 
>> more closely, the exact wording cannot be promoted to Collection.java 
>> because the behavior may in fact differ from the code sample.  size() may or 
>> may not be called.  toArray implementation is more likely to be atomic, 
>> etc...  So move it into the @implSpec somehow…

Done.

> 
> I wasn’t quite sure about this. “This method is equivalent to, or, as if the 
> following was invoked …” without actually specifying the actual 
> implementation. But I agree, AbstractFoo should only have @inheritDoc or 
> @implSpec. Let me see what happens when I move it into @implSpec.

Updated webrev and spec diff:
  http://cr.openjdk.java.net/~chegar/8031142/specdiff.01/overview-summary.html
  http://cr.openjdk.java.net/~chegar/8031142/webrev.01/webrev/

AbstractList retains its copy of the List add(E), clear(), and iterator() 
method specifications. When I replaced them with {@inheritdoc}, the 
Collection/AbstractCollection docs were copied in ( but we want the List docs 
). I think this is a javadoc bug. I’ll look into this separately.

-Chris.

> 
> -Chris.
> 

Reply via email to