Site icon Java blog

Java #25: varargs – zmienna liczba argumentów

java varargs

Korzystanie z varargs

Jesteś już wstanie bez problemu przeładowywać metody i konstruktory w klasie. Z reguły taka operacja opiera się na dodaniu dodatkowych parametrów do sygnatury metody lub konstruktora. Czasami jednak nie wiadomo jak wiele parametrów metoda powinna posiadać, a wielokrotne jej przeładowywanie, powoduje pisanie często nadmiarowego kodu. Aby tego uniknąć twórcy języka Java, wymyślili sprytne rozwiązanie o nazwie zmienna liczba argumentów w metodzie.

Załóżmy, że chcesz stworzyć bazę telefonów i wyświetlać różne ich parametry.

public class Cellphone {

  private static final String SPACE = " ";

  public static void main(String[] args) {
    showInfo("name: iPhone 10", "brand: Apple", "release date: November 3, 2017", "size: H: 143.6 mm x 70.9 mm x 7.7 mm" , 
        "display: 2436×1125 px", "system: IOS ", "memory: 3GB ", "battery: 2716 mA/h");
    showInfo("name: Galaxy S", "brand: Samsung", "release date: 4 June 2010");
  }

  public static void showInfo(String name, String brand, String releaseDate, String size, String display,
      String system, String memory, String battery) {
    System.out.println("Phone data: " + name + SPACE + brand + SPACE + releaseDate + SPACE
        + size + SPACE + display + SPACE + system + SPACE + memory + SPACE + battery);
  }
  
  public static void showInfo(String name, String brand, String releaseDate) {
    System.out.println("Phone data: " + name + SPACE + brand + SPACE + releaseDate);
  }
}

Tablica zamiast wielu argumentów

Jeśli masz tych parametrów naprawdę dużo i nie wiesz jakie ich kombinacje chcesz wyświetlić, to trzeba będzie się naprawdę napracować, żeby pokryć wszystkie możliwości. Powyższy kod, to tylko przykład takiego bardzo brzydkiego kodu. Na szczęście możesz go ładnie poprawić, używając tzw. varargs.

 

public class Cellphone {

  private static final String SPACE = " ";

  public static void main(String[] args) {
    showInfo("name: iPhone 10", "brand: Apple", "release date: November 3, 2017", "size: H: 143.6 mm x 70.9 mm x 7.7 mm" , 
        "display: 2436×1125 px", "system: IOS ", "memory: 3GB ", "battery: 2716 mA/h");
    showInfo("name: Galaxy S", "brand: Samsung", "release date: 4 June 2010");
    
    showInfoVar("name: iPhone 10", "brand: Apple", "release date: November 3, 2017", "size: H: 143.6 mm x 70.9 mm x 7.7 mm");
    showInfoVar("name: Galaxy S", "brand: Samsung", "release date: 4 June 2010");

  }

  public static void showInfo(String name, String brand, String releaseDate, String size, String display,
      String system, String memory, String battery) {
    System.out.println("Phone data: " + name + SPACE + brand + SPACE + releaseDate + SPACE
        + size + SPACE + display + SPACE + system + SPACE + memory + SPACE + battery);
  }
  
  public static void showInfo(String name, String brand, String releaseDate) {
    System.out.println("Phone data: " + name + SPACE + brand + SPACE + releaseDate);
  }

  public static void showInfoVar(String... parameters) {
    System.out.print("Phone data: ");
    for (int i = 0; i < parameters.length; i++) {
      System.out.print(parameters[i] + SPACE);
    }
  }
}

Don’t repeat yourself

Nowa metoda showInfoVar w zupełności pokrywa wszystkie kombinacje metody showInfo. Takie rozwiązanie jest zgodne z zasadą 'nie powtarzaj się” a zarazem pozbawia Cię obowiązku myślenia, ile parametrów potrzebujesz w sygnaturze. Jedyne obostrzenie to typ, który dla każdego z nich musi być taki sam. Zadasz pewnie pytanie, czym jest właściwe varargs w metodzie. Jak już się domyślasz, to po prostu tablica, która zawiera Twoje wszystkie argumenty. 

Phone data: name: iPhone 10 brand: Apple release date: November 3, 2017 size: H: 143.6 mm x 70.9 mm x 7.7 mm display: 2436×1125 px system: IOS  memory: 3GB  battery: 2716 mA/h
Phone data: name: Galaxy S brand: Samsung release date: 4 June 2010
Phone data: name: iPhone 10 brand: Apple release date: November 3, 2017 size: H: 143.6 mm x 70.9 mm x 7.7 mm Phone data: name: Galaxy S brand: Samsung release date: 4 June 2010

 

Mała uwaga na koniec. Jeśli nie chcesz drukować tekstu korzystając ze znaku końca linii (czyli z entera na końcu), to korzystaj z metody print zamiast println.

Link do lekcji: https://github.com/developeronthego/java-middle/tree/master/src/main/java/middle/lesson8

Jeśli nie wiesz, czym jest tablica, zajrzyj tutaj: Java #7: tablica oraz pętla for

Exit mobile version