Triki w Javie, których prawdopodobnie nie znasz

| 15 lutego 2016

Java jest rozbudowanym językiem, który kryje wiele ciekawych funkcji, z których nie zdają sobie sprawy nawet programiści z kilkuletnim doświadczeniem. W tym wpisie przedstawimy 3 ciekawe elementy języka, które pozwolą wam zabłysnąć i prawdopodobnie zagiąć informatyczne towarzystwo 🙂

wth-is-this

1. Etykiety

Pierwsza funkcjonalność to możliwość ustawienia etykiet przed pętlami w celu wygodniejszego ich przerywania. Standardowo mając tablicę dwuwymiarową i chcąc sprawdzić, czy istnieje w niej podana wartość moglibyśmy zapisać:

Konieczne jest ustawienie dodatkowej flagi, którą wykorzystujemy w warunkach pętli, aby przerwać ich działanie. W końcu jeżeli znajdziemy wartość, to nie ma sensu szukać dalej i tracić zasoby prawda? Da się to jednak to samo zapisać bez złożonych warunków w pętlach, ale zamiast tego stosując etykietę.

Oznaczyliśmy zewnętrzną pętlę etykietą „searchLoop” i od teraz możemy się do niej odwoływać zarówno z instrukcjach break jak i continue. W naszym przypadku instrukcja break przerwie działanie zewnętrznej pętli, a tym samym spowoduje natychmiastowe zakończenie wyszukiwania.

Etykiety nazywane są czasami także pętlami nazwanymi (named loops).

 

2. VarArgs

Czasami definiując metodę chcielibyśmy, aby mogła ona przyjąć różną liczbę argumentów. Stosując standardowe podejście musielibyśmy zdefiniować argument typu tablicowego lub kolekcję i ją przekazać jako argument, jednak zamiast tego ostatnim parametrem metody może być tzw. varargs, który docelowo i tak zostanie przekształcony na tablicę.

Metoda print() przyjmuje zmienną liczbę argumentów typu String. W zależności od tego, ile wartości do niej przekażemy, Java zadba o umieszczenie wszystkich wartości do tablicy i argument values należy traktować jako tablicę właśnie. Przewaga takiego rozwiązania nad parametrem typu tablicowego lub kolekcji jest taka, że możemy wywołać metodę print() bez żadnych argumentów:

Java przypisze w takiej sytuacji do zmiennej values pustą tablicę.

varargs

 

3. Inicjalizacja przez podwójne nawiasy klamrowe

Jedną z metod, która wykorzystuje parametry typu VarArgs jest Arrays.asList(), która pozwala w prosty sposób utworzyć listę na podstawie wartości, które od razu znamy. Zapis:

jest w końcu dużo wygodniejszy od:

Zamiast tego możemy jednak wykorzystać metodę inicjalizacji poprzez podwójne nawiasy klamrowe:

Na pierwszy rzut oka wygląda to na jakieś czary. Przede wszystkim z jakiegoś powodu nie możemy przy ArrayList użyć w takiej sytuacji operatora diamentu <> dodatkowo pojawiają się tajemnicze podwójne nawiasy. Jeżeli spojrzymy jakie pliki zostaną wygenerowane po kompilacji klasy, w której występuje taki zapis zauważymy dwa pliki .class np.:

Lists.class
Lists$1.class

Co więcej jeśli wydrukujemy na ekranie typ obiektu przypisanego do list2 zobaczymy, że wcale nie jest to ArrayList:

na ekranie wyświetla się „class Lists$1”.

Powinno nas to nakierować na odpowiedź co się stało. W rzeczywistości nie tworzymy obiektu ArrayList, tylko obiekt klasy anonimowej dziedziczącej po ArrayList, w której wykorzystujemy blok inicjujący. W podobny sposób możemy więc stworzyć obiekt każdej niefinalnej klasy. Ze względu na dodatkowy narzut pamięciowy warto jednak zachować ten sposób tworzenia obiektów jako ciekawostkę.

Chcecie poznać więcej podobnych trików? Obserwujcie naszego bloga i facebooka.

2 thoughts on “Triki w Javie, których prawdopodobnie nie znasz

  1. Marcin Szawurski

    Zamiast używać etykiety w przykładzie pierwszym, dużo czytelniej byłoby wyłączyć pętlę searchLoop do osobnej funkcji. W ten sposób w ogóle nie będzie nam potrzebna zmienna found, napiszemy sobie po prostu:

    if (search(tab, searchValue)) {

    }

    Dzięki za inspirujący wpis!

    Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *