5 niezbędnych bibliotek języka Java

Język Java rozwija się ostatnio bardzo dynamicznie i z każdą nową wersją daje coraz więcej interesujących możliwości. Jednak nie wszystkie przydatne dla programistów funkcje mogą znaleźć się w bibliotece standardowej języka. Dlatego bardzo często wielu programistów używa zewnętrznych bibliotek. Głównym ich zadaniem jest skrócenie czasu tworzenia pisania kodu i uproszczenie go. Przedstawię Ci dzisiaj, 5 niezbędnych bibliotek języka Java, które ułatwią życie każdemu programiście.

Apache Commons

Jest to jedna z najbardziej znanych bibliotek Javy. Właściwie to grupa bibliotek, które w wielu przypadkach ułatwiają życie. Obecnie to ponad 40 komponentów, które składają się na tę bibliotekę (każdego można używać osobno). A najpopularniejsze z nich to commons-lang, commons-io, commons-cli, commons-text itd. (cała lista tutaj) Warto odwiedzić strony poszczególnych komponentów i zapoznać się z listą klas i metod, jakie są w nich umieszczone. Jedna z najpopularniejszych klas zawartych w commons-lang jest klasa StringUtils, która zawiera bardzo wiele przydatnych metod np. isEmpty(...)isBlank(...) czy revers(...).

Mógłbym jeszcze wiele pisać na temat zawartości tej biblioteki, ale jest w niej tyle ciekawych rzeczy, że ciężko jest się skupić na czymś konkretnym. Dodam jeszcze, że nie widziałem poważnego projektu, który by nie korzystał z tej biblioteki. Jako potwierdzenie popularności Apache Commons niech posłużą statystyki zaczerpnięte z mvnrepository.com gdzie możemy zobaczyć, że commons-lang został użyty w ponad 11 tys. artefaktów, a commons-io w ponad 14 tyś.

Guava

Następną bardzo popularną biblioteką, którą mogę zaliczyć do 5 niezbędnych bibliotek języka Java jest Guawa – biblioteka stworzona i przez wiele lat rozwijana przez Google. Guava wprowadzała do Javy wiele idiomów funkcyjnych na długo przed powstaniem Javy 8. Była więc bardzo popularną biblioteką w starszych wersjach 1.6 i 1.7. Mimo tego, że wiele z jej funkcji zostało zastąpionych przez natywne funkcje wbudowane w język, ciągle jest warta uwagi. Można w niej znaleźć wiele ciekawych i przydatnych rozwiązań m.in.:

Niemutowalne kolekcje (Immutable collections)

Do czego w ogóle potrzebne są nam niemutowalne kolekcje? W większości przypadków doskonale sprawdzają się kolekcje z biblioteki standardowej. Jednak w niektórych przypadkach warto skorzystać z czegoś innego.

Niemutowalne kolekcje są to takie kolekcje, do których nie możemy dodawać nowych elementów i też usuwać starych. Jeśli raz utworzymy taką kolekcję, to nie możemy już jej zmienić. Przydaje się to w kilku scenariuszach:

  • jeśli używamy kolekcji w kontekście wielowątkowości, to kolekcje niezmienne są bezpieczne wielowątkowo (ThreadSafe) właśnie z tego względu, że po utworzeniu nie można zmienić ich zawartości;
  • gdy korzystasz z bibliotek, które nie do końca są zaufane (nie masz pewności czy dana biblioteka nie zmieni twojej kolekcji), warto wtedy jako parametry do metod z danej biblioteki przekazywać w parametrach kolekcje niezmienne;
  • kolekcje te są wydajniejsze, ponieważ nie posiadają mechanizmów dodawania i usuwania, więc są bardziej zoptymalizowane pod kątem odczytu.

A utworzyć taką kolekcję można w bardzo łatwy sposób:

ImmutableList<String> list = ImmutableList.of("a","b", "c");
ImmutableSet<String> set = ImmutableSet.of("a","b", "c");

Specjalne rodzaje kolekcji

Poza niemutowalnymi kolekcjami Guava udostępnia nam kilka bardzo ciekawych implementacji kolekcji, których nie znajdziecie w api Javy.

Są to Multiset, SortedMultisetMultimapListMultimapSetMultimapBiMapClassToInstanceMap,Table

Multiset

Jest to taki set, który zlicza wystąpienia elementów. Jeśli dodacie kilka razy tą samą wartość do tego seta, to możecie sprawdzić ile było wystąpień danej wartości korzystając z metody count(E)

Multimap

Multimapa jest konstrukcją trochę inną niż multiset. Jeśli dodamy do takiej mapy pod tym samym kluczem kilka wartości, to te wartości zostaną dopisane do listy wartości z danego klucza. W skrócie multimapa jest mapą list Map<T, Collection<V>>, ale pozwala się trochę wygodniej obchodzić z tą konstrukcją, gdyż zachowuje się tak jak gdyby to byłA zwykła mapa Map<K, V>.

BiMap

BiMapa to mapa, która może jest symetryczna, możemy ją traktować jak BiMap<K, V>, ale dzięki metodzie inverse() możemy ją traktować jak BiMap<V, K>.

Cache

W Guavie jest też prosty mechanizm cache, który jest całkiem dobry do podstawowych zastosowań i nie jest skomplikowany w konfiguracji, dzięki czemu oszczędza trochę czasu w porównaniu do innych rozwiązań.

Jest nawet szyna zdarzeń (EventBus)

Mamy też dostępną szynę zdarzeń, która może być przydatna w małych, a nawet średnich aplikacjach. W sytuacji, gdy potrzebujesz wymieniać informacje między komponentami, taka szyna jest bardzo wygodnym rozwiązaniem. Sprawia, że moduły są ze sobą luźno powiązane, co ułatwia pracę z nimi.

I cała masa klas użytkowych (utils)

Nie ma sensu wyliczać wszystkich dostępnych klas utilowych, bo jest ich całkiem sporo, ale wymienię najważniejsze z nich: Reflection, I/O, Math, Hashing, Primitives itd.

JUnit

Kolejną z 5 niezbędnych bibliotek języka Java jest moim zdaniem JUnit – biblioteka do wykonywania i pisania testów jednostkowych. Trudno wyobrazić sobie profesjonalny projekt bez testów jednostkowych, a Junit to najpopularniejsza biblioteka do testów w świecie Javy.

Krótki przykład testu:

public class SomeClassTest {

    private SomeClass testedClass;

    @Test
    public void testSimplMethod() {
        boolean result = testedClass.simpleMethod();
        assertTrue(result);
    }
}

Mockito

To także biblioteka, bez której ciężko jest prowadzić profesjonalny projekt w Javie. Biblioteka ta służy do mockowania (zaślepiania), zależności w testach jednostkowych. Jest bardzo prosta w użyciu. Przy użyciu kilku adnotacji możemy wstawić zaślepki dla wybranej metody i łatwo ją przetestować w izolacji.

public class SomeClass {

    @Inject
    private UserService userService;

    public boolean simpleMethod() {
        if (userService.getLoggedUser() != null) {
            return true;
        }
        return false;
    }
}

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest  {

    @Mock 
    UserService userService;
    
    @InjectMocks
    private ArticleManager manager; 

    @Test
    public void shouldReturnTrueWhenUserExists() {
        when(userService.getLoggedUser()).thenReturn(new User());
        boolean result = testedClass.simpleMethod();
        assertTrue(result);
    }
    
    @Test
    public void shouldReturFalseIfUserDoesNotExists() {
        when(userService.getLoggedUser()).thenReturn(null);
        boolean result = testedClass.simpleMethod();
        assertFalse(result);
    }
}

Log4j

To biblioteka, daje nam możliwość logowania zdarzeń z naszej aplikacji. Biblioteka ta, jak podobne rozwiązania tego typu obsługuje wiele poziomów logowania: trace, debug, info, warn, error, fatal.

Obsługuje różne appender’y, które pozwalają tak skonfigurować log4j by mógł zapisywać logi w różnych miejscach, zwykle jest to plik lub konsola, ale także może być to sql’owa baza danych lub jakieś inne rozwiązanie, np. baza nosql Cassandra, czy MongoDb, a nawet można go skonfigurować tak, by wysyłał logi poprze zapytania http.

Użycie jest bardzo proste, sprowadza się do dwóch linijek:

private static Logger log = Logger.getLogger(LogClass.class); //pobranie instancji logera dla naszej klasy
...
log.info("Info Message!"); // logowanie wiadomości

Podsumowanie

Jest wiele przydatnych bibliotek, ja wymieniłem tylko te 5 niezbędnych bibliotek języka Java, które moim zdaniem są niezastąpione w codziennym życiu programisty. Zawsze zanim zaczniesz pracę nad jakimś komponentem upewnij się najpierw, czy już wcześniej ktoś nie napisał czegoś podobnego. Biblioteki są po to, by nam pomagać i nie powielać już raz wykonanej pracy przez kogoś innego. Wiele firm przez lata wypracowuje własne biblioteki, które pomagają rozwiązywać codzienne problemy.

Z drugiej strony pamiętaj, by nie przesadzić z ilością bibliotek, czasem dołączanie do projektu biblioteki tylko po to, by użyć jednej metody jest przerostem formy nad treścią.

 

Źródła:

https://commons.apache.org/

https://github.com/google/guava/wiki

https://junit.org/junit5/

https://site.mockito.org/

https://logging.apache.org/log4j/2.x/

Mateusz Dąbrowski

Cześć jestem Mateusz, zajmuję się programowaniem już ponad 12 lat z czego ponad 8 programuję w Javie. Zapraszam Cię do lektury mojego bloga. Możesz przeczytać więcej o mnie >>TUTAJ<<