Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Do not reuse identifiers, public utility classes, interfaces, and packages in the Java standard libraryStandard Library.

Wiki Markup
If a developer uses an identifier that reuseshas the same name ofas a public class, such as {{Vector}}, a subsequent maintainer might not be aware that this identifier does not actually refer to {{java.util.Vector}}, and might unintentionally use the custom {{Vector}} instead of 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 Java Language Specification \[[JLS 2005|AA. Bibliography#JLS 05]\], [Section 6.[§6.3.2.|http://java.sun.com/docs/books/jls/third_edition/html/packagesnames.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 \[[JLS 2005|AA. Bibliography#JLS 05]\], [Section 7.[§7.5.2|http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5.2], "Type-Import-on-Demand Declaration") can result in importing an unintended class of the _Java Language Specification_ \[[JLS 2005|AA. Bibliography#JLS 05]\]). Additionally, a common, and potentially misleading, tendency 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; when a custom type is found earlier in the Java include path than the intended type, no further searches are conducted. 

...

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 java.util.Vector.isEmpty() method.

...

C Secure Coding Standard: "PRE04-C. Do not reuse a standard header file name"

C++ Secure Coding Standard: "PRE04-CPP. Do not reuse a standard header file name"

Bibliography

Wiki Markup
\[[JLS 2005|AA. Bibliography#JLS 05]\] 
[Section§ 6.3.2|http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.2] "Obscured Declarations", 
[Section 6§6.3.1|http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.1] "Shadowing Declarations", [Section 7
[§7.5.2|http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5.2] "Type-Import-On_Demand Declaration", 
[Section 14§14.4.3|http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.4.3] "Shadowing of Names by Local Variables"
\[[FindBugs 2008|AA. Bibliography#FindBugs 08]\]
\[[Bloch 2005|AA. Bibliography#Bloch 05]\] Puzzle 67: All Strung Out
\[[Bloch 2008|AA. Bibliography#Bloch 08]\] Item 16: Prefer interfaces to abstract classes

...