JavaRush /Blog Java /Random-PL /Wariacje Java

Wariacje Java

Opublikowano w grupie Random-PL
Dzisiaj omówimy coś takiego jak varargs w Javie. Varargs – czyli Zmienne Argumenty – to technologia pozwalająca na tworzenie metod z dowolną liczbą argumentów. W tym artykule dowiemy się, jak stworzyć takie metody, omówimy, dlaczego varargi są potrzebne i kiedy najlepiej je stosować.

Co to są varargi?

Varargs to argumenty o zmiennej długości: funkcja, która pojawiła się w JDK5. Varargs pozwalają nam tworzyć metody z dowolną liczbą argumentów. W zasadzie możliwe było stworzenie takich metod już wcześniej. To prawda, że ​​​​robienie tego nie było zbyt wygodne. Podajmy przykład. Załóżmy, że musimy napisać metodę, która pobierze dowolną liczbę argumentów będących liczbami całkowitymi i doda je do siebie. Zmienne Java - 1Mamy dwie opcje. Opcja 1 – przeciążenie:
class Calculator {
    int sum(int a, int b){...};
    int sum(int a, int b, int c){...};
    int sum(int a, int b, int c, int d){...};
    int sum(int a, int b, int c, int d, int e){...};
}
Ale są dwa problemy z przeciążeniem. Po pierwsze, nie zawsze jest jasne, kiedy należy się zatrzymać, a po drugie, jest to uciążliwe. Tablice są lepsze. Opcja 2 – tablice:
class Calculator {
    int sum(int[] numbers){...};
}
Z tablicą nie jest to już kłopotliwe, a tablica wydaje się nie wyglądać jak nic... dopóki nie nadejdzie czas wywołania metody:
public static void main(String... sss) {
    Calculator calculator = new Calculator();

    int[] arguments = new int[7];
    arguments[0] = 1;
    arguments[1] = 10;
    arguments[2] = 123;
    arguments[3] = 234;
    arguments[4] = 6234;
    arguments[5] = 12;
    arguments[6] = 8;

    int sum = calculator.sum(arguments);
}
Zgadzamy się, można oczywiście wszystko spisać krócej. Ale po pierwsze, nadal chciałbym zademonstrować niedogodności używania tablic jako argumentów o zmiennej długości, a po drugie, nawet jeśli zapiszemy to w ten sposób:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
Wtedy nadal nie pozbędziemy się nadmiernej ilości kodu. Jednak wraz z wydaniem Java 5 funkcja Varargs zdawała się rozwiązywać te problemy. Umożliwiło to przekazywanie dowolnej liczby argumentów do metod. Wygląda to mniej więcej tak:
public class Calculator {
    public static void main(String... sss) {
        Calculator calculator = new Calculator();
        int sum = calculator.sum(1,10,123,234,6234,12,8);
    }
    int sum(int... numbers){
       return Arrays.stream(numbers).sum();
    }
}
Podsumujmy więc. Varargs to argumenty o zmiennej długości, funkcja, która pojawiła się wraz z wydaniem Java 5. Następnie przyjrzymy się bliżej niektórym zasadom pracy z Varargs.

5 zasad varargów

Zasada 1. Argument Vararg (lub argument o zmiennej/dowolnej długości) jest oznaczony wielokropkiem w następujący sposób:
String... words
Integer... numbers
Person... people
Cat... cats
Zasada 2. Argument o dowolnej długości można podać tylko jako argument jakiejś metody:
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
Zasada 3. Każdy taki argument o zmiennej długości w treści metody jest tablicą:
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
Zasada 4. Argument Vararg musi być ostatnim na liście argumentów metody:
void print(String... words, String anotherWord) // - Так нельзя!
void print(String... words, int someNumber) // - Так нельзя!

void print(String anotherWord, String... words) // - Так можно
void print(int someNumber, String... words) // - Так можно
Zasada 5: Mimo że varargs są tablicami, podczas wywoływania metody pobierającej argumenty o zmiennej długości nie jest konieczne tworzenie tablicy. Wystarczające, a nawet pożądane jest po prostu wypisanie wymaganych argumentów oddzielonych przecinkami:
public class Main {
    public static void main(String... sss) {
        print("Jak","же","прекрасно","изучать","Java");
    }

    static void print(String... words){
        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i]);
        }
    }
}

Przykłady varargów

W poniższym przykładzie napiszemy metodę, która pobiera varargs składające się z liczb całkowitych i wyświetla liczbę przekazanych elementów oraz ich sumę. Przekażmy do tej metody zarówno tablicę, jak i serię liczb całkowitych (obie opcje są prawidłowe):
public static void main(String... sss) {
    int[] a = new int[100];
    for (int i = 0; i < a.length; i++) {
        a[i] = i;
    }

    sum(a);
    sum(1,2,3,4,5,6,7,8,9,10);
}

static void sum(int... numbers){
    final int length = numbers.length;
    final int sum = Arrays.stream(numbers).sum();
    final String lineSeparator = System.lineSeparator();

    System.out.printf("Кол-во элементов для сложения - %d, сумма - %d%s", length, sum, lineSeparator);
}
Po uruchomieniu program wyświetli:

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
Warto wspomnieć, że metoda System.out.printfakceptuje również varargs. Jeśli spojrzymy na kod tej metody, zobaczymy to:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
Inną powszechnie stosowaną metodą, która akceptuje varagi, jest String.format. Jego kod pokazano poniżej:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

Kiedy używać varargs?

Odpowiedź na to pytanie zależy od tego, kto pyta. Jeśli podobne pytanie zadaje klient jakiegoś API, które ma metody z varargs, to odpowiedź brzmiałaby „używaj takich metod tak często, jak to możliwe”. W przypadku klienta kodu varargs znacznie ułatwia życie, czyniąc kod łatwiejszym do napisania i bardziej czytelnym. Jeśli jednak to pytanie zadaje programista API, który zastanawia się, jak często należy tworzyć metody z użyciem zmiennych varargs, wówczas odpowiedź będzie brzmieć: „nie należy często używać varargs”. Varargs należy stosować tylko wtedy, gdy korzyść z jego użycia jest oczywista. Powinieneś także unikać przeciążania metod varargami, ponieważ utrudni to klientom Twojego kodu zrozumienie, która z przeciążonych metod jest faktycznie wywoływana.

Wniosek

Omówiliśmy więc inny temat, varargs w Javie. Ustaliliśmy, co to jest. Opisaliśmy zasady korzystania z varargs. Przyjrzeliśmy się przykładom metod z argumentami o dowolnej długości, a także omówiliśmy, kiedy lepiej jest używać varargs, a kiedy lepiej się od nich powstrzymać. Jako pracę domową możesz wdrożyć następujące metody:
  • Napisz voidmetodę, która pobiera serię liczb całkowitych i zwraca ich średnią arytmetyczną.
  • Napisz voidmetodę, która pobiera serię ciągów znaków i wypisuje najdłuższe słowo.
  • Napisz metodę, która zwraca booleani przyjmuje zmienną typu jako pierwszy argument Stringoraz serię booleanzmiennej długości jako następny argument.
    Możliwe wartości Stringto AND, OR, XOR. Jeśli pierwszy argument ma inną wartość, metoda musi zgłosić wyjątek IllegalArgumentException.
    Metoda musi wykonać operację logiczną (określoną w pierwszym argumencie) na każdym elemencie argumentu varargs i zwrócić wynik obliczenia.
Przykładowe argumenty i wynik:
  • „AND”, prawda, prawda, fałsz - zwróci fałsz
  • „LUB”, fałsz, prawda, fałsz, fałsz - zwróci prawdę
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION