Programowanie średniozaawansowane #8: Zmienna liczba parametrów w metodzie

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.

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

 

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ć.

 

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

 

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.

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.

Dodaj komentarz