Czytaj docs’y & kod źródłowy!

Stosunkowo często spotykam się z pytaniami ze strony początkujących programistów dotyczącymi implementacji interfejsów, metod z podstawowej biblioteki Javy. Często nie rozumiemy dlaczego zaimplementowany kod zadziałał tak, a nie inaczej. Cóż, ja też często tego nie rozumiem, ponieważ w szybkim drafcie nie zajmuje się zapamiętywaniem wszystkiego. Jednak jak tylko napotkam taki problem, wiem, że roziwiązaniem jest dokumentacja i jej zasoby.

Kod źródłowy

Jakiś rok temu, rozmawiając z kolegami usłyszałem stwierdzenie, które zapewne już na zawsze zdefiniuje moje podejście od pracy z kodem źródłowym i dokumentacją języka.

Czytanie dokumentacji oraz praca z kodem źródłowym jest wyznacznikiem dojrzałości programisty

Podam przykład pracy z kodem źródłowym nad którym ostatnio miałem okazję popracować. Zagadnienie nad którym przyszło mi się pochylić związane było z implementacją ArrayList<T>, która była przekazywana jako parametr w metodzie

void xyz(ArrayList<T> list);

Padło pytanie dlaczego, mimo zdefiniowania obiektu T, który jest przechowywany w liście, da się przekazać do metody ArrayList<>() (czyli listę bez zdefiniowanego obiektu)? 

Okazuje się, że konstruktor, który nie przyjmuje żadnego argumentu dla klasy ArrayList ma postać

public ArrayList() {
   this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

gdzie, DEFAULTCAPACITY_EMPTY_ELEMENTDATA jest tablicą dla typu Object.

Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

Jak wiadomo, każda klasa stworzona w Javie dziedziczy po klasie Object. Patrząc w górę hierarchii dziedziczenia, każda klasa typu T (np klasa napisana przez nas), dziedziczy po klasie Object. Zatem jest klasą typu Object. Bazując na powyższych znaleziskach otrzymujemy odpowiedź na zaistniałe pytanie: Skoro pusta lista przetrzymuje pustą tablicę typu Object, to można ją przekazać w miejsce każdej ArrayList’y niezależnie od tego, czy lista przechowuje predefiniowany typ obiektu.

Dokumentacja

A jak pracować z dokumentacją? Dokumentacja jest świetną bazą “wypadową” na początku pracy z biblioteką oraz w przypadku, gdy nie pamiętamy wszystkich niuansów związanych z daną biblioteką. Dla programisty, który ma już trochę doświadczenia korzystanie z dokumentacji powinno być chlebem powszednim. Dokumentacja Javy oprócz definicji wszystkich metod, klas i interfejsów, bardzo zwięźle opisuje zasady działania powyższych.

Przykład z Klasy ArrayLIst() (dokumentacja java 11 jest dostępna pod linkiem : https://docs.oracle.com/en/java/javase/11/docs/api/index.html

Patrząc od góry dostajemy informację o hierarchii dziedziczenia dla klasy ArrayList a następnie dowiadujemy się jakie interfejsy ją rozszerzają. Kolejnym elementem jest ogólny opis działania danej klasy oraz notatki dodatkowe tak jak w przypadku ArrayListy, gdzie zostajemy ostrzeżeni, że klasa ta nie jest bezpieczna w przypadku pracy dla wielu wątków, należy użyć metody synchronizedList klasy Collections, która zwraca obiekt typu List (a zatem także, ArrayList). (Więcej o interfejsach przeczytasz w tym poscie)

public static <T> List<T> synchronizedList​(List<T> list);

Poniżej opisu znajduje się lista wszystkich dostępnych konstruktorów oraz metod wraz z krótkimi opisami. 

Początkowa część dokumentacji dla ArrayList
Opis dostępnych konstruktorów oraz metod kalsy ArrayList

Podsumowanie

Jak widzimy dokumentacja nie jest taka straszna i stanowi bezcenne źródło skondensowanej wiedzy na temat elementów biblioteki z którą przyszło nam pracować.


Dodaj komentarz

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