Created
April 15, 2020 08:11
-
-
Save ToanPV90/8a5c8ce99141ee930c56773ffc9317ab to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
It's Varargs :) | |
The varargs short for variable-length arguments is a feature that allows the method to accept variable number of arguments (zero or more). With varargs it has become simple to create methods that need to take a variable number of arguments. The feature of variable argument has been added in Java 5. | |
Syntax of varargs | |
A vararg is secified by three ellipsis (three dots) after the data type, its general form is | |
return_type method_name(data_type ... variableName){ | |
} | |
Need for varargs | |
Prior to Java 5, in case there was a need of variable number of arguments, there were two ways to handle it | |
If the max number of arguments, a method can take was small and known, then overloaded versions of the method could be created. If the maximum number of arguments a method could take was large or/and unknown then the approach was to put those arguments in an array and pass them to a method which takes array as a parameter. These 2 approaches were error-prone - constructing an array of parameters every time and difficult to maintain - as the addition of new argument may result in writing a new overloaded method. | |
Advantages of varargs | |
Offers a much simpler option. Less code as no need to write overloaded methods. | |
Example of varargs | |
public class VarargsExample { | |
public void displayData(String ... values){ | |
System.out.println("Number of arguments passed " + values.length); | |
for(String s : values){ | |
System.out.println(s + " "); | |
} | |
} | |
public static void main(String[] args) { | |
VarargsExample vObj = new VarargsExample(); | |
// four args | |
vObj.displayData("var", "args", "are", "passed"); | |
//three args | |
vObj.displayData("Three", "args", "passed"); | |
// no-arg | |
vObj.displayData(); | |
} | |
} | |
Output | |
Number of arguments passed 4 | |
var | |
args | |
are | |
passed | |
Number of arguments passed 3 | |
Three | |
args | |
passed | |
Number of arguments passed 0 | |
It can be seen from the program that length is used here to find the number of arguments passed to the method. It is possible because varargs are implicitly passed as an array. Whatever arguments are passed as varargs are stored in an array which is referred by the name given to varargs. In this program array name is values. Also note that method is called with different number of argument, first call with four arguments, then three arguments and then with zero arguments. All these calls are handled by the same method which takes varargs. | |
Restriction with varargs | |
It is possible to have other parameters with varargs parameter in a method, however in that case, varargs parameter must be the last parameter declared by the method. | |
void displayValues(int a, int b, int … values) // OK | |
void displayValues(int a, int b, int … values, int c) // compiler error | |
Another restriction with varargs is that there must be only one varargs parameter. | |
void displayValues(int a, int b, int … values, int … moreValues) // Compiler error | |
Overloading varargs Methods | |
It is possible to overload a method that takes varargs parameter. Varargs method can be overloaded by - | |
Types of its vararg parameter can be different. By adding other parameters. Example of overloading varargs method | |
public class OverloadingVarargsExp { | |
// Method which has string vararg parameter | |
public void displayData(String ... values){ | |
System.out.println("Number of arguments passed " + values.length); | |
for(String s : values){ | |
System.out.println(s + " "); | |
} | |
} | |
// Method which has int vararg parameter | |
public void displayData(int ... values){ | |
System.out.println("Number of arguments passed " + values.length); | |
for(int i : values){ | |
System.out.println(i + " "); | |
} | |
} | |
// Method with int vararg and one more string parameter | |
public void displayData(String a, int ... values){ | |
System.out.println(" a " + a); | |
System.out.println("Number of arguments passed " + values.length); | |
for(int i : values){ | |
System.out.println(i + " "); | |
} | |
} | |
public static void main(String[] args) { | |
OverloadingVarargsExp vObj = new OverloadingVarargsExp(); | |
// four string args | |
vObj.displayData("var", "args", "are", "passed"); | |
// two int args | |
vObj.displayData(10, 20); | |
// One String param and two int args | |
vObj.displayData("Test", 20, 30); | |
} | |
} | |
Output | |
Number of arguments passed 4 | |
var | |
args | |
are | |
passed | |
Number of arguments passed 2 | |
10 | |
20 | |
a Test | |
Number of arguments passed 2 | |
20 | |
30 | |
Varargs and overloading ambiguity | |
In some cases call may be ambiguous while we have overloaded varargs method. Let's see an example | |
public class OverloadingVarargsExp { | |
// Method which has string vararg parameter | |
public void displayData(String ... values){ | |
System.out.println("Number of arguments passed " + values.length); | |
for(String s : values){ | |
System.out.println(s + " "); | |
} | |
} | |
// Method which has int vararg parameter | |
public void displayData(int ... values){ | |
System.out.println("Number of arguments passed " + values.length); | |
for(int i : values){ | |
System.out.println(i + " "); | |
} | |
} | |
public static void main(String[] args) { | |
OverloadingVarargsExp vObj = new OverloadingVarargsExp(); | |
// four string args | |
vObj.displayData("var", "args", "are", "passed"); | |
// two int args | |
vObj.displayData(10, 20); | |
// This call is ambiguous | |
vObj.displayData(); | |
} | |
} | |
In this program when we make a call to displayData() method without any parameter it throws error, because compiler is not sure whether this method call is for displayData(String ... values) or displayData(int ... values) | |
Same way if we have overloaded methods where one has the vararg method of one type and another method has one parameter and vararg parameter of the same type, then also we have the ambiguity - As Exp - displayData(int ... values) and displayData(int a, int ... values) | |
These two overloaded methods will always have ambiguity. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment