-
CSR
-
Resolution: Approved
-
P3
-
None
-
source, behavioral
-
minimal
-
-
Java API, File or wire format
-
JDK
Summary
Improve method documentation inheritance.
Problem
The documentation comment specification for the standard doclet poorly specifies documentation inheritance.
The structure of inheritable elements and relationships between them are left to reader's intuitions.
The
javadoctool implements Method Comments Algorithm differently from how the documentation comment specification for the standard doclet specifies it.Although neither the expected nor the actual behavior is ideal, each has a good trait that the other does not.
Documentation inheritance lacks control.
Regardless of a particular automatic algorithm, there will always be a case where it does a wrong thing.
Solution
To improve the specification, clarify the scope and rules of inheritance for individual elements.
Clarify that:
/** {@inheritDoc} */explicitly inherits only the main description,@throws X {@inheritDoc}inherits all the tags describing theXexception type, not just some of them,- information for a method parameter, formal or type, is inherited by the parameter position, not by parameter name, to address possible parameter renaming among overrides
To reconcile the expected behavior with the actual behavior of Method Comments Algorithm, re-specify it and re-implement it in the
javadoctool.The proposal is to prefer a superclass to a superinterface, unless the superclass is
java.lang.Object, in which case prefer a superinterface.While that proposal generally preserves the current behavior -- to prefer a superclass to a superinterface -- it also recognizes that any documentation -- even of a superinterface -- is more specific than that of
java.lang.Object.To illustrate that change, we'll use diagrams. A diagram depicts an inheritance hierarchy. An edge points from a subtype to a supertype. Square brackets
[ ]depict a class, parentheses( )depict an interface. Asterisk*marks thejava.lang.Objectclass.The search order can be traced by following the sequence of integers, starting from
1. A class or an interface marked with1is searched first, with2is searched second, and so on.Let's consider two cases of a method that inherits documentation.
The method is declared in a class.
The current expected behavior is as follows:
(5) ^ * / [7] (3) (4) ^ ^ ^ \ | / \ | / [6] (2) ^ ^ | / | / [1]The current actual behavior is as follows:
(6) ^ * / [3] (4) (5) ^ ^ ^ \ | / \ | / [2] (7) ^ ^ | / | / [1]This proposal is to change the behavior as follows:
(5) ^ * / [7] (3) (4) ^ ^ ^ \ | / \ | / [2] (6) ^ ^ | / | / [1]The method is declared in an interface.
The current expected behavior is as follows:
(3) (4) ^ ^ \ / (2) (5) ^ ^ \ / (1)Currently, the specification does not mention methods whose signature is override-equivalent to the signature of a public overridable method in
java.lang.Object-- of which there are three:equals,hashCode, andtoString, sojava.lang.Objectis never visited and, hence, is not on the diagram.However, the current actual behavior is to treat interfaces as if they had
java.lang.Objectas their superclass. Combined with preferring a superclass to a superinterface, the search short-circuits on the first interface's "superclass",java.lang.Object, which means that for the three relevant methods superinterfaces are not considered:(4) (5) ^ ^ \ / (3) (6) ^ ^ \ / (1) | v [2] *This proposal is to change the behavior as follows:
(3) (4) ^ ^ \ / (2) (5) ^ ^ \ / (1) | v [6] *This change to the algorithm is backwards incompatible, but its scope is limited to the three public overridable methods of
java.lang.Objectand any unwanted differences in the generated documentation can be corrected by using directed inheritance, which is also introduced in this CSR below.
To control documentation inheritance as required, allow directed inheritance.
Directed inheritance allows
@inheritDocto provide a supertype:{@inheritDoc <class-or-interface>}with the semantics that the inheritor gets documentation of the specified supertype, which in turn might inherit its documentation.
While it has always been possible to copy-paste the desired documentation explicitly rather than inherit it, unlike this proposal, it's suboptimal (Don't Repeat Yourself) and lossy: potentially useful information on inheritance source is missing.
Specification
See the attached specification-v3.patch and api-v3.patch files. The latter
is no different from api-v2.patch and added for clarity, to reflect the
overall proposal revision change.
- csr of
-
JDK-8285368 Overhaul doc-comment inheritance
-
- Resolved
-
- relates to
-
JDK-8296320 Warn if {@inheritDoc} is ambiguous
-
- Open
-