JDK 9 RFR - 8031142 [was: Re: Using @implSpec in AbstractMap, AbstractCollection, AbstractList, etc]
Martin Buchholz
martinrb at google.com
Mon Jan 6 21:06:12 UTC 2014
- JDK <https://bugs.openjdk.java.net/browse/JDK>
- JDK-6270645 <https://bugs.openjdk.java.net/browse/JDK-6270645>
Javadoc comments should be inherited from most derived superinterface or
superclass
-
but that's marked fixed...
On Mon, Jan 6, 2014 at 12:49 PM, Chris Hegarty <chris.hegarty at oracle.com>wrote:
>
> On 6 Jan 2014, at 18:11, Chris Hegarty <chris.hegarty at oracle.com> wrote:
>
> > On 6 Jan 2014, at 17:05, Martin Buchholz <martinrb at 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.
> >
>
>
More information about the core-libs-dev
mailing list