...
The @SuppressWarnings
annotation can be used in the declaration of variables and methods as well as an entire class. It is, however, very important to narrow down its scope so that other noteworthy warnings within the same scope are not silently ignored.
Noncompliant Code Example
In this noncompliant code example, the @SuppressWarnings
annotation's scope encompasses the whole class:
...
This code is dangerous because all unchecked warnings within the class will be suppressed. Oversights of this nature can lead to a ClassCastException
at runtime.
Compliant Solution
Limit the scope of the @SuppressWarnings
annotation to the nearest code that generates a warning. In this case, it may be used in the declaration for the Set
:
Code Block | ||
---|---|---|
| ||
class Legacy { @SuppressWarnings("unchecked") Set s = new HashSet(); public final void doLogic(int a,char c) { s.add(a); // Produces unchecked warning s.add(c); // Produces unchecked warning } } |
Noncompliant Code Example (ArrayList
)
This noncompliant code example is from the implementation of java.util.ArrayList
:
...
Because the return
statement is not a declaration, the Java Language Specification [JLS 2011] makes it impossible to suppress the warning trivially by using @SuppressWarnings
at that statement. Consequently, the @SuppressWarnings
is used over method scope where it is allowed. This can cause issues when some functionality that performs type-unsafe operations is added to the method at a later date [Bloch 2008].
Compliant Solution (ArrayList
)
When it is impossible to use the @SuppressWarnings
annotation, as in the preceding noncompliant code example, declare a new variable to hold the return value and adorn it with the @SuppressWarnings
annotation.
Code Block | ||
---|---|---|
| ||
// ... @SuppressWarnings("unchecked") T[] result = (T[]) Arrays.copyOf(elements, size, a.getClass()); return result; // ... |
Applicability
Failure to reduce the scope of the @SuppressWarnings
annotation can lead to runtime exceptions and break type-safety guarantees.
This rule cannot be statically enforced in full generality; static analysis could be possible for some special cases.
Bibliography
[API 2011] | Annotation Type SuppressWarnings |
[Bloch 2008] | Item 24, "Eliminate Unchecked Warnings" |
...