Java-варарги (змінні аргументи) з прикладами

У цій статті ви дізнаєтеся про varargs в Java за допомогою прикладів. Ви також дізнаєтесь, коли використовувати варарги, а коли не використовувати їх.

Що таке varargs в Java?

Припустимо, ви створюєте метод Java. Однак ви не впевнені, скільки аргументів прийме ваш метод. Для вирішення цієї проблеми Java 1.5 представила varargs.

Varargs - це коротка назва змінних аргументів. У Java аргумент методу може приймати довільну кількість значень. Цей аргумент, який може приймати змінну кількість значень, називається varargs.

Синтаксис реалізації varargs такий:

 accessModifier methodName (тип даних… аргумент) (// тіло методу)

Для того, щоб визначити vararg, у формальному параметрі методу використовується (три крапки).

Метод, який приймає змінну кількість аргументів, називається методом змінної сутності або просто методом varargs.

Спочатку давайте розглянемо приклад, не використовуючи 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)); ) )

Коли ви запускаєте цю програму, результат буде:

 3 6

Як ви можете чітко бачити, вам довелося перевантажити sumNumber()метод, щоб він працював для 3 аргументів.

Що робити, якщо користувач хоче додати 5 чисел або 10 або 100?

З цим можна впоратися акуратно, використовуючи варагаги. Давайте подивимось приклад коду:

Приклад: Робота з вараргами

 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); ) )

Коли ви запускаєте програму, результат буде:

 довжина аргументу: 2 сума2 = 6 довжина аргументу: 3 сума3 = 9 довжина аргументу: 4 сума4 = 16

Тут sumNumber()метод повертає суму intпереданих йому параметрів (не має значення кількість переданих аргументів).

Як бачите, варарги можуть бути справді корисними в деяких ситуаціях. Однак, якщо ви впевнені в кількості аргументів, переданих методу, замість цього використовується метод перевантаження. Наприклад, якщо ви впевнені, що sumNumber()метод буде використовуватися лише для обчислення суми 2 або 3 аргументів, використовуйте перевантаження, як у першому прикладі.

Візьмемо ще один приклад. Метод format (), визначений у бібліотеці Java, приймає varargs. У JDK format()метод визначається наступним чином:

 загальнодоступний статичний формат рядка (локаль l, формат рядка, об’єкт… аргументи) (// тіло)

Приклад: Метод 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 ) ); ) )

Коли ви запускаєте програму, результат буде:

 Назва сайту: programiz.com, Кількість випускників: 6 Тип: навчальний веб-сайт 

Як працює varargs за лаштунками?

Давайте розглянемо наступний псевдокод:

 public int sumNumber (int… nums) (// тіло методу)

Синтаксис говорить компілятор Java , що метод може бути викликаний з нулем або більше аргументів. Як результат, змінна nums неявно оголошується як масив типу int( ). Таким чином, усередині методу доступ до змінної nums здійснюється за допомогою синтаксису масиву.

У разі відсутності аргументів довжина nums дорівнює 0.

Перевантаження методів Varargs

Подібно до типових методів, ви можете перевантажити методи vararg.

Рекомендоване читання: Перевантаження методу Java

Приклад: Перевантаження методу 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"); ) ) 

Коли ви запускаєте програму, результат буде:

 сума = 6 заперечення = помилкові аргументи. довжина = 2

У наведеній вище програмі test()метод перевантажений, змінюючи кількість прийнятих аргументів.

Що слід пам’ятати під час використання Varargs

Ось кілька речей, про які слід пам’ятати під час роботи з Java-варгарами:

1. Визначаючи підпис методу, завжди нарешті зберігайте varargs.

Аргумент змінної повинен бути останнім аргументом, переданим методу. Давайте розглянемо, ви викликали doSomething()метод наступним чином:

 doSomething (1, 2, 3, 4);

І, ваш doSomething()метод визначається як:

 // неправильне оголошення методу public void doSomething (int… nums, int p) (// тіло методу)

У цьому випадку компілятор не може визначити кількість аргументів, переданих nums.

Однак якщо ви визначите свій метод як:

 public void doSomething (int p, int… nums) (// тіло методу)

Компілятор Java призначає перший аргумент p, а решта intаргументів присвоюється nums.

2. Метод може мати лише один параметр varargs.

Наприклад, ця декларація методу є неправильною:

 int doSomething (int p, float … floatNums, double … doubleNums) (// код)

Неоднозначність у перевантаженні методу Варарга

Давайте розглянемо ваш перевантажений test()метод таким чином:

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

У наведеній вище програмі компілятор заплутається, якщо ви спробуєте викликати test()метод, навіть якщо test()методи перевантажені і приймає різну кількість аргументів.

Компілятор не знає, який метод викликати. Компілятор може подумати, ви намагаєтесь зателефонувати за test(int… vargs)допомогою одного аргументу varargs. Крім того, компілятор може подумати, ви намагаєтесь зателефонувати test(int n, int… vargs)з аргументом, переданим першому параметру з порожнім другим параметром.

Оскільки існує дві можливості, це викликає неоднозначність. Через це іноді може знадобитися використовувати дві різні назви методів замість того, щоб перевантажувати метод varargs.

Цікаві статті...