Do not reuse the names of publicly - visible identifiers, public utility classes, interfaces, or packages in the Java Standard Library.
| Wiki Markup |
|---|
When a developer uses an identifier that has the same name as a public class, such as {{Vector}}, a subsequent maintainer might not be awareunaware that this identifier does not actually refer to {{java.util.Vector}}, and might unintentionally use the custom {{Vector}} insteadrather ofthan 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, [§6.3.2, "Obscured Declarations"|http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.2] of the _Java Language Specification_ \[[JLS 2005|AA. Bibliography#JLS 05]\]. This can result in unexpected program behavior. |
| Wiki Markup |
|---|
Well-defined import statements can resolve these issues. However, when reused name definitions are imported from other packages, use of the _type-import-on-demand declaration_ (see the JLS, [§7.5.2, "Type-Import-on-Demand Declaration"|http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5.2] of the _Java Language Specification_ \[[JLS 2005|AA. Bibliography#JLS 05]\]) can complicate a programmer's attempt to determine which specific definition was intended to be used. Additionally, a common, and potentially misleading, tendency practice that can lead to errors is to produce the import statements _after_ writing the code, often via automatic inclusion of import statements by an IDE. This creates further ambiguity with respect to the names;. whenWhen a custom type is found earlier than the intended type in the Java include path than the intended type, no further searches are conducted. Consequently, the wrong type is silently adopted. |
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.
...
| Wiki Markup |
|---|
When the developer and organization control the original shadowed class, it may be preferable to change the design strategy of the original in accordance with Bloch's _Effective Java_ \[[Bloch 2008|AA. Bibliography#Bloch 08]\], "Item 16:, Prefer interfaces to abstract classes." Changing the original class into an interface would permit class {{MyVector}} to declare that it implements the hypothetical {{Vector}} interface. This would permit client code that intended to use {{MyVector}} to remain compatible with code that uses the original implementation of {{Vector}}. |
...
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="f6407392ef039cb5-f7bf9ef7-4a2b4025-a7ad8678-beedb354dbb3464de7ce07ca"><ac:plain-text-body><![CDATA[ | [[JLS 2005 | AA. Bibliography#JLS 05]] | [§6.3.2, " Obscured Declarations" | http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.2] | ]]></ac:plain-text-body></ac:structured-macro> |
| |||||
| |||||
| |||||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="750d00255f66c39b-8818475c-47f04c31-8839a7e6-2b0898f6054643823ad00a49"><ac:plain-text-body><![CDATA[ | [[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="15ee49424467c494-27dea0bf-41de45d8-a01bbd78-33e88ed7057555afb1c88cb2"><ac:plain-text-body><![CDATA[ | [[Bloch 2005 | AA. Bibliography#Bloch 05]] | Puzzle 67: , All Strung Outstrung out | ]]></ac:plain-text-body></ac:structured-macro> | |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="4073f6e2e7a76be5-bf76311b-4dce4066-9ff192b5-2d873283be8c056671251db9"><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> |
...