NỘI DUNG BÀI VIẾT
Varargs trong Java đã được giới thiệu trong Java 1.5. Java varargs còn được gọi là đối số linh động trong Java.
Java varargs
Variable Argument – Varargs trong Java cho phép phương thức chấp nhận các đối số zero hoặc muliple. Trước khi varargs, chúng ta sử dụng overload phương thức hoặc lấy một mảng làm tham số method nhưng nó không phải là phương án tốt. Nếu chúng ta không biết có bao nhiêu đối số được truyền vào phương thức, varargs là cách tiếp cận tốt hơn.
public static int sum(int i, int...js ){
//do something
}
Code language: PHP (php)
Những điểm quan trọng về varargs trong java
Một số điểm cần biết về varargs trong java là;
- Chúng ta chỉ có thể có một varargs trong phương thức.
- Chỉ đối số cuối cùng của một phương thức mới có thể là varargs.
- Theo tài liệu java, chúng ta không nên quá tải phương thức varargs. Chúng ta sẽ biết tại sao đó không phải là một ý kiến hay.
Cách hoạt động của Varargs
Khi chúng ta gọi một phương thức có các đối số linh động, trình biên dịch java sẽ khớp các đối số từ trái sang phải. Khi nó đạt đến tham số varargs cuối cùng, nó sẽ tạo ra một mảng các đối số còn lại và chuyển nó cho phương thức. Trên thực tế, tham số varargs hoạt động giống như một mảng của kiểu được chỉ định.
//method with variable arguments
public static int sum(int i, int...js ){
int sum = i;
for(int x : js){
sum+=x;
}
return sum;
}
//method with same implementation as sum with array as argument
public static int sumArray(int i, int[] js ){
int sum = i;
for(int x : js){
sum+=x;
}
return sum;
}
Code language: PHP (php)
Nếu bạn nhìn vào cả hai hàm sum và sumArray, bạn sẽ thấy rằng phần thân thực thi hoàn toàn giống nhau. Vì vậy, chúng ta nên sử dụng varargs khi API cung cấp chúng, ví dụ như phương thức java.io.PrintStream.printf() nhưng chúng ta không nên coi nó như một sự thay thế cho mảng.
Tại sao chúng ta không nên overload phương thức varargs
Hãy xem ví dụ dưới đây để biết rằng sử dụng overloading phương thức varargs không phải là ý kiến tốt.
public class VarargsExample {
public static void main(String[] args) {
System.out.println(sum(1));
System.out.println(sum(1,2)); //compiler error, ambiguous method
}
public static int sum(int i, int...js ){
System.out.println("sum1 called");
int sum = i;
for(int x : js){
sum+=x;
}
return sum;
}
public static int sum(int i, int k, Object...js ){
System.out.println("sum2 called");
int sum = i+k;
for(Object x : js){
sum+=1;
}
return sum;
}
}
Code language: JavaScript (javascript)
Trong ví dụ trên, bạn sẽ nhận thấy rằng trình biên dịch sẽ không phàn nàn khi chúng ta nạp chồng các phương thức với varargs. Nhưng khi chúng tôi cố gắng sử dụng nó, trình biên dịch sẽ bối rối nên sử dụng phương pháp nào khi ánh xạ đối số thứ hai.
Nếu chỉ có một đối số, trình biên dịch sẽ thông minh khi sử dụng phương thức đầu tiên vì nó có thể hoạt động với tối thiểu một đối số nhưng phương thức thứ hai cần ít nhất hai đối số. Hình ảnh dưới đây từ Eclipse cho thấy thông báo lỗi là Phương thức sum(int, int []) không rõ ràng đối với kiểu VarargsExample.
Đó là tất cả về java varargs. Thật tốt khi biết tính năng nhưng bạn không cần phải sử dụng nó khi tự viết mã.
Happy learning!!!