 
                            The variable arity (varargs) feature was introduced in the Java Development Kit ( JDK ) v1.5.0 to support methods that accept a variable numbers of arguments.unmigrated-wiki-markup
According to the Java SE 6 documentation \[[Sun 2006|AA. Bibliography#Sun 06]\]:[Oracle 2011b],
As an API designer, you should use [variable arity methods] sparingly, only when the benefit is truly compelling. Generally speaking, you should not overload a varargs method, or it will be difficult for programmers to figure out which overloading gets called.
As an API designer, you should use \[varargs methods\] sparingly, only when the benefit is truly compelling. Generally speaking, you should not overload a varargs method, or it will be difficult for programmers to figure out which overloading gets called. Wiki Markup 
Noncompliant Code Example
In this noncompliant code example, overloading varargs variable arity methods makes it unclear which definition of the doSomethingdisplayBooleans() method is invoked.:
| Code Block | ||
|---|---|---|
| 
 | ||
| class OverloadedVarargsVarargs { private static void doSomethingdisplayBooleans(boolean... bool) { System.out.print("Number of arguments: " + bool.length + ", Contents: "); for (boolean b : bool) System.out.print("[" + b + "]"); } private static void doSomethingdisplayBooleans(boolean bool1, boolean bool2) { System.out.println("Overloaded method invoked"); } public static void main(String[] args) { doSomethingdisplayBooleans(true, false); } } | 
When run, this program outputs:
| Code Block | 
|---|
| 
Overloaded method invoked
 | 
because the non-varargs nonvariable arity definition is more specific and , consequently , a better fit for the provided arguments given. However, this complexity is best avoided.
Compliant Solution
To avoid overloading varargs variable arity methods, use distinct method names to ensure that the intended method is invoked, as shown in this compliant solution. :
| Code Block | ||
|---|---|---|
| 
 | ||
| class NotOverloadedVarargsVarargs { private static void doSomething1displayManyBooleans(boolean... bool) { System.out.print("Number of arguments: " + bool.length + ", Contents: "); for (boolean b : bool) System.out.print("[" + b + "]"); } private static void doSomething2displayTwoBooleans(boolean bool1, boolean bool2) { System.out.println("Overloaded method invoked"); System.out.println("Contents: [" + bool1 + "], [" + bool2 + "]"); } public static void main(String[] args) { doSomething1displayManyBooleans(true, false); } } | 
Exceptions
Applicability
Injudicious use of overloaded variable arity methods may create ambiguity and diminish code readability.
It may be desirable to violate this rule for performance reasons. One such reason would be to avoid the cost of creating an array instance and initializing it on every invocation of a method [Bloch 2008Wiki Markup 
| Code Block | ||
|---|---|---|
| 
 | ||
| 
public void foo() { }
public void foo(int a1) { }
public void foo(int a1, int a2, int... rest) { }
 | 
When overloading varargs variable arity methods, it is important to avoid any ambiguity regarding which method would should be invoked. This The preceding code sample avoids the possibility of incorrect method selection by using unambiguous method signatures.
Risk Assessment
Unmindful use of the varargs feature may create ambiguity and diminish code readability.
| Guideline | Severity | Likelihood | Remediation Cost | Priority | Level | 
|---|---|---|---|---|---|
| DCL08-J | low | unlikely | medium | P2 | L3 | 
Automated Detection
Automated detection is straightforward.
Bibliography
| Wiki Markup | 
|---|
| \[[Bloch 2008|AA. Bibliography#Bloch 08]\] Item 42: "Use Varargs Judiciously"
\[[Steinberg 2005|AA. Bibliography#Steinberg 05]\] "Using the Varargs Language Feature"
\[[Sun 2006|AA. Bibliography#Sun 06]\] [varargs|http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html]  | 
Automated detection is straightforward.
Automated Detection
| Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Parasoft Jtest | 
 | CERT.DCL57.OVAM | Avoid overloading varargs methods | 
Bibliography
| Item 42, "Use Varargs Judiciously" | |
| "Using the Varargs Language Feature" | |
...
DCL07-J. Beware of integer literals beginning with '0' 01. Declarations and Initialization (DCL) DCL09-J. Enable compile-time type checking of varargs types