Using @implSpec in AbstractMap, AbstractCollection, AbstractList, etc
Doug Lea
dl at cs.oswego.edu
Sat Dec 28 13:47:41 UTC 2013
There might have been some mis-communication about whether the
new @implSpec tag would be used in existing java.util.AbstractX
classes. I had assumed that it would be, and pulled out a few
javadoc overrides in java.util.concurrent classes that would
not be needed if @implSpec were used. With @implSpec, you do
not need to paste in the interface-level spec in an overridden
method just to suppress inclusion of (incorrect) doc comments
about the default implementation.
Is it too late to do this for JDK8? It is easy -- just add a line
with @implSpec for each defined method. AbstractMap diffs
below. (They could be tweaked to get rid of now-unnecessary
paragraph markup, but I don't think this would improve display.)
If this isn't done, then minimally we'd need to paste in
interface-level specs in ConcurrentHashMap.{size, isEmpty}
since the JDK8 javadocs as they stand are wrong. There
may be other cases as well.
...
diff -r 8bc258c021a3 src/share/classes/java/util/AbstractMap.java
--- a/src/share/classes/java/util/AbstractMap.java Thu Nov 21 09:23:03 2013 -0800
+++ b/src/share/classes/java/util/AbstractMap.java Sat Dec 28 08:33:42 2013 -0500
@@ -78,6 +78,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation returns <tt>entrySet().size()</tt>.
*/
public int size() {
@@ -87,6 +88,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation returns <tt>size() == 0</tt>.
*/
public boolean isEmpty() {
@@ -96,6 +98,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation iterates over <tt>entrySet()</tt> searching
* for an entry with the specified value. If such an entry is found,
* <tt>true</tt> is returned. If the iteration terminates without
@@ -126,6 +129,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation iterates over <tt>entrySet()</tt> searching
* for an entry with the specified key. If such an entry is found,
* <tt>true</tt> is returned. If the iteration terminates without
@@ -157,6 +161,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation iterates over <tt>entrySet()</tt> searching
* for an entry with the specified key. If such an entry is found,
* the entry's value is returned. If the iteration terminates without
@@ -191,6 +196,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation always throws an
* <tt>UnsupportedOperationException</tt>.
*
@@ -206,6 +212,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation iterates over <tt>entrySet()</tt> searching for an
* entry with the specified key. If such an entry is found, its value is
* obtained with its <tt>getValue</tt> operation, the entry is removed
@@ -255,6 +262,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation iterates over the specified map's
* <tt>entrySet()</tt> collection, and calls this map's <tt>put</tt>
* operation once for each entry returned by the iteration.
@@ -276,6 +284,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation calls <tt>entrySet().clear()</tt>.
*
* <p>Note that this implementation throws an
@@ -302,6 +311,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation returns a set that subclasses {@link AbstractSet}.
* The subclass's iterator method returns a "wrapper object" over this
* map's <tt>entrySet()</tt> iterator. The <tt>size</tt> method
@@ -358,6 +368,7 @@
/**
* {@inheritDoc}
*
+ * @implSpec
* <p>This implementation returns a collection that subclasses {@link
* AbstractCollection}. The subclass's iterator method returns a
* "wrapper object" over this map's <tt>entrySet()</tt> iterator.
@@ -425,6 +436,7 @@
* <tt>equals</tt> method works properly across different implementations
* of the <tt>Map</tt> interface.
*
+ * @implSpec
* <p>This implementation first checks if the specified object is this map;
* if so it returns <tt>true</tt>. Then, it checks if the specified
* object is a map whose size is identical to the size of this map; if
@@ -478,6 +490,7 @@
* <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of
* {@link Object#hashCode}.
*
+ * @implSpec
* <p>This implementation iterates over <tt>entrySet()</tt>, calling
* {@link Map.Entry#hashCode hashCode()} on each element (entry) in the
* set, and adding up the results.
More information about the core-libs-dev
mailing list