Java Varargs (Đối số có thể thay đổi) với các ví dụ

Trong bài viết này, bạn sẽ tìm hiểu về các varargs trong Java với sự trợ giúp của các ví dụ. Bạn cũng sẽ học khi nào sử dụng kỳ đà và khi nào không sử dụng chúng.

Varargs trong Java là gì?

Giả sử bạn đang tạo một phương thức Java. Tuy nhiên, bạn không chắc có bao nhiêu đối số mà phương pháp của bạn sẽ chấp nhận. Để giải quyết vấn đề này, Java 1.5 đã giới thiệu varargs.

Varargs là tên viết tắt của các đối số biến. Trong Java, một đối số của một phương thức có thể chấp nhận số lượng giá trị tùy ý. Đối số có thể chấp nhận số lượng giá trị thay đổi này được gọi là varargs.

Cú pháp để triển khai varargs như sau:

 accessModifier methodName (datatype… arg) (// thân phương thức)

Để định nghĩa vararg, (ba dấu chấm) được sử dụng trong tham số chính thức của một phương thức.

Một phương thức có số lượng đối số thay đổi được gọi là phương thức biến-arity, hoặc đơn giản là phương thức varargs.

Đầu tiên, hãy xem ví dụ mà không sử dụng varargs:

 class NoVararg ( public int sumNumber(int a, int b)( return a+b; ) public int sumNumber(int a, int b, int c)( return a+b+c; ) public static void main( String() args ) ( NoVararg obj = new NoVararg(); System.out.println(obj.sumNumber(1, 2)); System.out.println(obj.sumNumber(1, 2, 3)); ) )

Khi bạn chạy chương trình này, đầu ra sẽ là:

 3 6

Như bạn có thể thấy rõ, bạn đã phải nạp chồng sumNumber()phương thức để làm cho nó hoạt động cho 3 đối số.

Điều gì sẽ xảy ra nếu người dùng muốn thêm 5 số hoặc 10 hoặc 100?

Điều này có thể được xử lý một cách gọn gàng với việc sử dụng kỳ đà. Hãy xem một ví dụ mã:

Ví dụ: Làm việc của kỳ đà

 class VarargExample ( public int sumNumber(int… args)( System.out.println("argument length: " + args.length); int sum = 0; for(int x: args)( sum += x; ) return sum; ) public static void main( String() args ) ( VarargExample ex = new VarargExample(); int sum2 = ex.sumNumber(2, 4); System.out.println("sum2 = " + sum2); int sum3 = ex.sumNumber(1, 3, 5); System.out.println("sum3 = " + sum3); int sum4 = ex.sumNumber(1, 3, 5, 7); System.out.println("sum4 = " + sum4); ) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 độ dài đối số: 2 sum2 = 6 độ dài đối số: 3 sum3 = 9 độ dài đối số: 4 sum4 = 16

Ở đây, sumNumber()phương thức trả về tổng các inttham số được truyền cho nó (không quan trọng số lượng đối số được truyền).

Như bạn có thể thấy, kỳ đà có thể thực sự hữu ích trong một số tình huống. Tuy nhiên, nếu bạn chắc chắn về số lượng đối số được truyền cho một phương thức, hãy sử dụng phương thức nạp chồng thay thế. Ví dụ: nếu bạn chắc chắn rằng sumNumber()phương thức đó sẽ chỉ được sử dụng để tính tổng của 2 hoặc 3 đối số, hãy sử dụng tính năng nạp chồng như trong ví dụ đầu tiên.

Hãy lấy một ví dụ khác. Phương thức format () được định nghĩa trong thư viện Java chấp nhận varargs. Trong JDK, format()phương thức được định nghĩa như sau:

 định dạng chuỗi tĩnh công khai (Ngôn ngữ l, Định dạng chuỗi, Đối tượng… args) (// body)

Ví dụ: phương thức format ()

 class Company ( public static void main(String() args) ( String siteName = "programiz.com"; int empCount = 6; String type = "tutorial website"; System.out.println( String.format( "Site Name : %s, Emp Count: %d Type: %s", siteName, empCount, type ) ); ) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 Tên trang web: Programiz.com, Số lượng trống: 6 Loại: trang web hướng dẫn 

Kỳ đà hoạt động như thế nào đằng sau hậu trường?

Hãy xem xét mã giả sau:

 public int sumNumber (int… nums) (// phần thân phương thức)

Các cú pháp cho trình biên dịch Java rằng phương pháp này có thể được gọi với số không hay nhiều đối số. Kết quả là, biến nums được khai báo ngầm định là một kiểu kiểu mảng int( ). Do đó, bên trong phương thức, biến nums được truy cập bằng cú pháp mảng.

Trong trường hợp không có đối số, độ dài của num là 0.

Nạp chồng các phương thức Varargs

Tương tự như các phương thức thông thường, bạn có thể nạp chồng các phương thức vararg.

Đề xuất Đọc: Quá tải phương pháp Java

Ví dụ: Nạp chồng phương pháp Varargs

 class VarargOverload ( private void test(int… args)( int sum = 0; for (int i: args) ( sum += i; ) System.out.println("sum = " + sum); ) private void test(boolean p, String… args)( boolean negate = !p; System.out.println("negate = " + negate); System.out.println("args.length = "+ args.length); ) public static void main( String() args ) ( VarargOverload obj = new VarargOverload(); obj.test(1, 2, 3); obj.test(true, "hello", "world"); ) ) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 sum = 6 negate = false args.length = 2

Trong chương trình trên, test()phương thức được nạp chồng bằng cách thay đổi số lượng đối số mà nó chấp nhận.

Những điều cần nhớ khi sử dụng Varargs

Dưới đây là một số điều bạn nên nhớ khi làm việc với Java vargars:

1. Trong khi xác định chữ ký của phương thức, hãy luôn giữ các varargs cuối cùng.

Đối số biến phải là đối số cuối cùng được truyền cho phương thức. Hãy xem xét, bạn đã gọi doSomething()phương thức như thế này:

 doSomething (1, 2, 3, 4);

Và, doSomething()phương pháp của bạn được định nghĩa là:

 // khai báo sai phương thức public void doSomething (int… nums, int p) (// method body)

Trong trường hợp này, trình biên dịch không thể tìm ra số đối số được truyền cho nums.

Tuy nhiên, nếu bạn xác định phương pháp của mình là:

 public void doSomething (int p, int… nums) (// thân phương thức)

Trình biên dịch Java gán đối số đầu tiên cho p và các intđối số còn lại được gán cho nums.

2. Một phương thức chỉ có thể có một tham số varargs.

Ví dụ: khai báo phương thức này không chính xác:

 int doSomething (int p, float… floatNums, double… doubleNums) (// code)

Sự mơ hồ trong quá tải Phương thức Varargs

Hãy xem xét bạn đã quá tải test()phương thức như thế này:

 class Demo (static void test (int… vargs) (// method body) static void test (int n, int… vargs) (// method body))

Trong chương trình trên, trình biên dịch sẽ nhầm lẫn nếu bạn cố gọi test()phương thức mặc dù test()các phương thức được nạp chồng và chấp nhận số lượng đối số khác nhau.

Trình biên dịch không biết phương thức nào để gọi. Trình biên dịch có thể nghĩ rằng bạn đang cố gọi test(int… vargs)với một đối số varargs. Ngoài ra, trình biên dịch có thể nghĩ rằng, bạn đang cố gọi test(int n, int… vargs)với đối số được truyền cho tham số đầu tiên với tham số thứ hai trống.

Vì có hai khả năng, nó gây ra sự mơ hồ. Do đó, đôi khi bạn có thể cần phải sử dụng hai tên phương thức khác nhau thay vì nạp chồng phương thức varargs.

thú vị bài viết...