JAVA

Thread.join()

Jeśli chcemy aby aktualny wątek poczekał na inny wątek zanim ten zakończy swoją robotę można do tego celu wykorzystać metodę Thread.join. Prosty przykład użycia Dzięki wywołaniu w powyższym kodzie metody join mamy pewność, że wątek wywołujący (w tym wypadku metoda main) poczeka na wątek przechowywany w referencji thread. Bez tego nie mamy tej gwarancji (w …

Thread.join() Czytaj dalej »

Java 10 – co nowego?

W niniejszym wpisie przyjrzymy się wybranym nowościom w Java wersji 10. Pełną listę zmian można znaleźć tutaj. var – wnioskowanie typu No to doczekaliśmy się w Javie JavaScriptu 😉 Oczywiście, jest to żart. Słowo kluczowe var w języku Java nie powoduje, że zmienna staje się globalna, ale raczej to, że można do niej przypisać obiekt dowolnego …

Java 10 – co nowego? Czytaj dalej »

Java 9 – co nowego?

W niniejszym wpisie przyjrzymy się wybranym nowościom w Java wersji 9. Pełną listę zmian wprowadzonych w Java 9 można znaleźć tutaj. Moduły Moduły zostały wprowadzone w celu zapewnienia większej enkapsulacji – dzięki nim możliwe jest między innymi używanie publicznych klas w ramach modułu bez obawy, że ktoś będzie mógł zaraz ich użyć. Moduły pozwalają na …

Java 9 – co nowego? Czytaj dalej »

Wzorzec pośrednik w API Javy (Proxy, InvocationHandler)

Java w swoim API dostarcza klas pozwalających na łatwą implementację wzorca pośrednik. Są to odpowiednio Proxy oraz InvocationHandler. Dzięki nim możliwe jest dynamiczne tworzenie pośredników dla klas. Implementacja ta wykorzystuje mechanizm oparty o refleksje i opiera się o interfejsy, stąd nie będzie możliwe użycie klasy nie implementującej żadnego interfejsu. Dynamiczny pośrednik Ktoś mógłby zapytać po …

Wzorzec pośrednik w API Javy (Proxy, InvocationHandler) Czytaj dalej »

ThreadLocal – co to takiego?

ThreadLocal jest klasą pozwalającą na łatwe przechowywanie wartości dla każdego wątku oddzielnie – każdy wątek ma swoją wartość. Korzystanie z klasy ThreadLocal Klasa ThreadLocal udostępnia podstawowe operacje takie jak:–get()–set(T value)–remove()Dzięki którym możemy przykładowo operować na wartości przypisanej do wątku: Jednak w sytuacji gdy mamy tylko jeden wątek nie ma najmniejszego sensu używanie klasy ThreadLocal. Lepiej …

ThreadLocal – co to takiego? Czytaj dalej »

Typy uogólnione – zawężenie poprzez ’?’ (unbounded wildcard)

Tak naprawdę zawężanie poprzez ’?’ mówi o tym, że typ jest kompletnie nieznany – więc w rzeczy samej nie powoduje żadnego zawężenia. List versus List<?> versus List<Object> Powstaje więc pytanie – skoro znak ’?’ nie powoduje, żadnego zawężenia to po co go używać? Może lepiej będzie nie używać w ogóle typów ogólnych (List list = …

Typy uogólnione – zawężenie poprzez ’?’ (unbounded wildcard) Czytaj dalej »

Kontrakt equals & hashCode

Kontrakt equals & hashCode wynika w dużej mierze z tego jak działają HashSet i HashMap. I jakby nie patrzeć dotyczy on sytuacji, gdzie wykorzystywane będą kolekcje oparte o obliczanie hashCode (czego umówmy się, najczęściej ciężko uniknąć podczas pisania kodu 😉 ). Kontrakt Kontrakt z drugiej strony Czyli zacznijmy teraz od warunku opartego o hashCode: Wydajność …

Kontrakt equals & hashCode Czytaj dalej »

HashSet i HashMap

Zarówno HashSet jak i HashMap są oparte o hashCode. Polegają one na hashCode w celu uporządkowania danych w tak zwanych koszykach (buckets). Po czym wewnątrz każdego koszyka, używana jest metoda equals, aby znaleźć konkretny element (jeśli jest ich więcej niż jeden w koszyku). Z takiego stanu rzeczy wynika też kontrakt equals & hashCode. Jak zostało …

HashSet i HashMap Czytaj dalej »

Spliterator

Jak sama nazwa wskazuje (spliterator) jest to swojego rodzaju iterator pozwalający na podział na mniejsze. Oprócz możliwości podziału posiada jeszcze kilka innych ciekawych funkcjonalności. Podział – trySplit() Wygląda to trochę jak podział komórkowy 🙂 Ponieważ każdy podział z reguły powinien dzielić aktualny Spliterator na dwa mniejsze o takim samym rozmiarze: Przechodzenie po elementach – tryAdvance() …

Spliterator Czytaj dalej »

Iterator wewnętrzny i zewnętrzny

Iterator może występować w dwóch formach – wewnętrznej lub zewnętrznej. Iterator wewnętrzny To taki, którego przebiegu nie kontrolujemy sami – dostarczamy tylko algorytm, który ma zostać wykonany dla każdego elementu. Przykładem takiego iteratora jest metoda forEach interfejsu Iterable. A z racji tego, że każda kolekcja implementuje ten interfejs, to na każdej kolekcji możemy skorzystać z …

Iterator wewnętrzny i zewnętrzny Czytaj dalej »