...
Wiki Markup |
---|
Well-defined import statements can resolve these issues. However, when reused name definitions are imported from other packages, use the _type-import-on-demand declaration_ (see [§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]\]). 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. |
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 java.util.Vector.isEmpty()
method.
Code Block | ||
---|---|---|
| ||
class Vector { private int val = 1; public boolean isEmpty() { if (val == 1) { // compares with 1 instead of 0 return true; } else { return false; } } // other 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"); } } } |
Compliant Solution (Class Name)
This compliant solution uses a different name for the class, preventing any potential shadowing.
...
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}}. |
Risk Assessment
Name reuse decreases the readability and maintainability of code.
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
DCL05-J | low | unlikely | medium | 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
C Secure Coding Standard |
C++ Secure Coding Standard |
Bibliography
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="21cb5a893a681e31-5e0d3563-400841e4-9d7ba6b8-f3bfe1ff03b7028cd4d92d82"><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="4b5ae1a624d137e2-f5988dd6-4d5d4ff6-833ab64d-06c85285dfd43d5f5b6d7d9b"><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="b507f219df15664b-eb378a47-49f54e9a-bc24b353-d458ae3b40cbc8e99bbb1fa3"><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="d1a940eda38d2563-27a167e3-41594c85-9cb29c79-0e6cc358de4736e1073c902c"><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> |
...