Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Addressed the comments and changed to Applicability

The variable arity (varargs) feature was introduced in the JDK v1.5.0 to support methods that accept a variable numbers of arguments.

...

As an API designer, you should use [varargs 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.

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
bgColor#FFCCCC
class Varargs {
  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 variable arity definition is more specific and consequently a better fit for the 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
bgColor#ccccff
class Varargs {
  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");  
  }
  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.

DCL59-EX0: 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 2008].

Code Block
bgColor#ccccff
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 should be invoked. This code sample avoids the possibility of incorrect method selection by using unambiguous method signatures.

Risk Assessment

Injudicious use of overloaded varargs methods may create ambiguity and diminish code readability.

Guideline

Severity

Likelihood

Remediation Cost

Priority

Level

DCL59-JG

low

unlikely

medium

P2

L3

Automated

...

Automated detection is straightforward.

Bibliography

[Bloch 2008]

Item 42: "Use Varargs Judiciously"

[Steinberg 2005]

"Using the Varargs Language Feature"

[Sun 2006]

varargs

 

Image Removed      01. Declarations and Initialization (DCL)      DCL60-JG. Enable compile-time type checking of varargs types

...