rspec/rules/S1176/java/rule.adoc
Fred Tingaud 51369b610e
Make sure that includes are always surrounded by empty lines (#2270)
When an include is not surrounded by empty lines, its content is inlined
on the same line as the adjacent content. That can lead to broken tags
and other display issues.
This PR fixes all such includes and introduces a validation step that
forbids introducing the same problem again.
2023-06-22 10:38:01 +02:00

165 lines
3.8 KiB
Plaintext

== Why is this an issue?
Try to imagine using the standard Java API (Collections, JDBC, IO, ...) without Javadoc. It would be a nightmare, because Javadoc is the only way to understand of the contract of the API. Documenting an API with Javadoc increases the productivity of the developers consuming it.
On top of a main description for each member of a public API, the following Javadoc elements are required to be described:
* Parameters, using ``++@param parameterName++``.
* Thrown exceptions, using ``++@throws exceptionName++``.
* Method return values, using ``++@return++``.
* Generic types, using ``++@param <T>++``.
Furthermore the following guidelines should be followed:
* At least 1 line of description.
* All parameters documented with ``++@param++``, and names should match.
* All checked exceptions documented with ``++@throws++``
* ``++@return++`` present and documented when not ``++void++``.
* Placeholders like ``++"TODO"++``, ``++"FIXME"++``, ``++"..."++`` should be avoided.
The following public methods and constructors are not taken into account by this rule:
* Getters and setters.
* Methods overriding another method (usually decorated with ``++@Override++``).
* Empty constructors.
* Static constants.
For the parameters of the rule, the following rules are applied:
* ``++?++`` matches a single character
* ``++*++`` matches zero or more characters
* ``++**++`` matches zero or more packages
Examples:
* ``++java.internal.InternalClass++`` will match only ``++InternalClass++`` class.
* ``++java.internal.*++`` will match any member of ``++java.internal++`` package.
* ``++java.internal.**++`` same as above, but including sub-packages.
=== Noncompliant code example
[source,java]
----
/**
* This is a Javadoc comment
*/
public class MyClass<T> implements Runnable { // Noncompliant - missing '@param <T>'
public static final DEFAULT_STATUS = 0; // Compliant - static constant
private int status; // Compliant - not public
public String message; // Noncompliant
public MyClass() { // Noncompliant - missing documentation
this.status = DEFAULT_STATUS;
}
public void setStatus(int status) { // Compliant - setter
this.status = status;
}
@Override
public void run() { // Compliant - has @Override annotation
}
protected void doSomething() { // Compliant - not public
}
public void doSomething2(int value) { // Noncompliant
}
public int doSomething3(int value) { // Noncompliant
return value;
}
}
----
=== Compliant solution
[source,java]
----
/**
* This is a Javadoc comment
* @param <T> the parameter of the class
*/
public class MyClass<T> implements Runnable {
public static final DEFAULT_STATUS = 0;
private int status;
/**
* This is a Javadoc comment
*/
public String message;
/**
* Class comment...
*/
public MyClass() {
this.status = DEFAULT_STATUS;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public void run() {
}
protected void doSomething() {
}
/**
* Will do something.
* @param value the value to be used
*/
public void doSomething(int value) {
/**
* {@inheritDoc}
*/
public int doSomething(int value) {
return value;
}
}
----
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
=== Message
Document this public [class|interface|method|constructor|field|enum|annotation].
Document the parameter(s): {...}
Document this method return value.
=== Parameters
.forClasses
****
----
**/api/**
----
Pattern of classes which should adhere to this constraint. Ex : **/api/**
****
'''
== Comments And Links
(visible only on this page)
include::../comments-and-links.adoc[]
endif::env-github,rspecator-view[]