 
                            Do not reuse the names of publicly visible identifiers, public utility classes, interfaces, or packages in the Java Standard Library.
Wiki Markup Vector}},   a   subsequent   maintainer   might   be   unaware   that   this   identifier   does   not   actually   refer   to  {{java.util.Vector}}  and   might   unintentionally   use   the   custom  {{Vector}}  rather   than   the   original  {{java.util.Vector}}  class.   The   custom   type  {{Vector}}  can  [shadow|BB. Definitions#shadow]  a   class   name   from  {{java.util.Vector}},   as   specified  by the JLS, [§6by The Java Language Specification (JLS), §6.3.2,   "Obscured   Declarations"|http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.2] \ [[JLS   2005|AA. Bibliography#JLS 05]\]. This can result in unexpected program behavior.], and unexpected program behavior can occur.
Wiki Markup 
Noncompliant Code Example (Class Name)
This noncompliant code example implements a class that reuses the name of the class java.util.Vector. It attempts to introduce a different condition for the isEmpty() method for interfacing with native legacy code by overriding the corresponding method in java.util.Vector. Unexpected behavior can arise if a maintainer confuses the isEmpty() method with the java.util.Vector.isEmpty() method.
| Code Block | ||
|---|---|---|
| 
 | ||
| class Vector { private int val = 1; public boolean isEmpty() { if (val == 1) { // comparesCompares with 1 instead of 0 return true; } else { return false; } } // otherOther functionality is same as java.util.Vector } // import java.util.Vector; omitted public class VectorUser { public static void main(String[] args) { Vector v = new Vector(); if (v.isEmpty()) { System.out.println("Vector is empty"); } } } | 
...
This compliant solution uses a different name for the class, preventing any potential shadowing of the class from the Java Standard Library.:
| Code Block | ||
|---|---|---|
| 
 | ||
| class MyVector { //otherOther code } | 
Wiki Markup MyVector to declare that it implements the hypothetical Vector interface. With this technique, client code that intended to use MyVector would remain compatible with code that uses the original implementation of Vector.
Risk Assessment
Public identifier reuse decreases the readability and maintainability of code.
| Rule | Severity | Likelihood | Detectable | 
|---|
| Repairable | Priority | Level | 
|---|---|---|
| DCL01-J | 
| Low | Unlikely | 
| Yes | 
| No | P2 | L3 | 
Automated Detection
An automated tool can easily detect reuse of the set of names representing public classes or interfaces from the Java Standard Library.
Related Guidelines
Bibliography
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="579c25c0-d995-427b-88fe-ef0074a9d576"><ac:plain-text-body><![CDATA[
[[JLS 2005
AA. Bibliography#JLS 05]]
| Puzzle 67, "All Strung Out" | |
| Item 16, "Prefer Interfaces to Abstract Classes" | |
| [JLS 2005] | 
| §6.3.2, | 
http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.2]
]]></ac:plain-text-body></ac:structured-macro>
| "Obscured Declarations" §6.3.1, "Shadowing Declarations" | 
| §7.5.2, "Type-Import-on-Demand Declaration | 
| " §14.4.3, "Shadowing of Names by Local Variables | 
| " | 
[[FindBugs 2008
AA. Bibliography#FindBugs 08]]
]]></ac:plain-text-body></ac:structured-macro>
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="33e9e421-eebd-4deb-9af0-01e53c2e225f"><ac:plain-text-body><![CDATA[
[[Bloch 2005
AA. Bibliography#Bloch 05]]
Puzzle 67. All strung out
]]></ac:plain-text-body></ac:structured-macro>
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="494d7eea-5d77-4b09-831f-f80b6fd8856c"><ac:plain-text-body><![CDATA[
[[Bloch 2008
AA. Bibliography#Bloch 08]]
Item 16. Prefer interfaces to abstract classes
]]></ac:plain-text-body></ac:structured-macro>
...
01. Declarations and Initialization (DCL) DCL02-J. Declare all enhanced for statement loop variables final