Deprecated – Czy kiedykolwiek zdarzyło Ci się spotkać z oznaczeniem „deprecated” przeglądając kod Java? Wiesz, co ono oznacza? Wiesz jakie konsekwencje niesie za sobą korzystanie z przestarzałych elementów języka?
Nie? – To zapraszam do lektury! 🙂
Z tego materiału dowiesz się:
- Co to jest i jak działa adnotacja @deprecated w Java
- Dlaczego nie powinniśmy korzystać z fragmentów kodu oznaczonych jako @deprecated
- Jak oznaczyć fragmenty kodu, których nie możemy jeszcze usunąć, ale jednocześnie nie chcemy, żeby były dalej wykorzystywane
Spis treści
Deprecated
Jako programiści, jesteśmy stale zmuszeni do dostosowywania się do zmieniających się standardów i nowych rozwiązań. Nowa biblioteka, czy nowa wersja wykorzystywanego frameworka – i aktualizujemy zależności. Ewentualnie zmieniają się wymagania biznesowe od naszego ulubionego klienta i przy nowej wersji aplikacji będą potrzebne duże zmiany w naszym API.
Ot, zwykła codzienność programistyczna.
Kod źródłowy nigdy nie jest statyczny, tylko cały czas się zmienia. To jednak powoduje, że pojawiają się w nim fragmenty, które jeszcze są nam potrzebne, bo cały czas gdzieś są wykorzystywane, ale jednocześnie wiemy, że nie powinniśmy już ich wykorzystywać w nowo pisanym kodzie, bo jest już dostępna (albo zaraz będzie) nowa, ulepszona wersja.
Wykorzystanie Deprecated
I tutaj właśnie z pomocą przychodzi nam oznaczenie @Deprecated. Oznaczamy w ten sposób takie „przestarzałe” fragmenty kodu – jednoznacznie wysyłając wyraźny sygnał do innych developerów, żeby przynajmniej 3 razy się zastanowili, zanim z tego skorzystają… 🙂
Deprecated Java
Zrozumienie pojęcia „Java Deprecated” jest ważnym krokiem w kierunku utrzymania kompatybilności i uniknięcia problemów związanych z przestarzałym kodem.
„Java Deprecated” to termin, który oznacza, że dana funkcja, klasa lub metoda jest przestarzała i nie powinna być już używana w nowych projektach. Oznaczenie to pojawia się przed deklaracją elementu – na przykład:
Deprecjacja jest często stosowana przez twórców języka Java, aby oznaczyć elementy, które zostaną usunięte w przyszłych wersjach języka.
Oznacza to, że programiści muszą być ostrożni podczas korzystania z przestarzałych elementów i upewnić się, że ich kod jest zgodny z nowszymi wersjami języka.
Oczywiście podobna zależność zachodzi, jeżeli mówimy o dowolnej zewnętrznej bibliotece, fremoworku, czy nawet innym fragmencie kodu, który wykorzystujemy w naszej aplikacji.
Deprecated IDE
Większość popularnych IDE pomaga nam w rozróżnieniu takiego kodu i wyraźnie go oznaczy np. przez przekreślenie nazwy.
➡ ZOBACZ 👉: IDE Zintegrowane środowisko programistyczne | Kurs Java
Co możemy oznaczyć jako deprecated?
Tak naprawdę, prawie każdy element w naszym kodzie:
- Interfejs
- Klasę
- Metodę
- Zmienną klasową
- Czy nawet, konstruktor
Deprecated – Biblioteki i frameworki
Wraz z rozwojem projektu zmienia się jego interfejs API, co często jest naturalnym elementem rozwoju oprogramowania. Z biegiem czasu istnieją pewne konstruktory, pola, typy lub metody, których nie chcemy już używać, bo zwyczajnie istnieje nowa, ulepszona wersja.
Zamiast łamać kompatybilność wsteczną API projektu, możemy oznaczyć te elementy adnotacją @Deprecated.
Czyli, deprecjacja jest również stosowana przez twórców bibliotek i frameworków, aby oznaczyć elementy, które zostaną zastąpione nowszymi, lepszymi rozwiązaniami. W takim przypadku programiści powinni również być ostrożni i upewnić się, że ich kod jest zgodny z nowszymi wersjami bibliotek i frameworków.
Deprecated forRemoval
Java 9 dodaje kilka opcjonalnych atrybutów do adnotacji @Deprecated: since oraz forRemoval.
Atrybut since pozwala na określenie, od której wersji naszej aplikacji dany fragment kodu jest deprecated.
A forRemoval to wartość logiczna, która pozwala nam określić, czy element zostanie usunięty w następnej wersji. Jego domyślną wartością jest fałsz:
Mówiąc najprościej, powyższe użycie oznacza, że dany fragment kodu jest przestarzały od wersji 5.11 naszej biblioteki i że zaplanowano jego usunięcie w następnej głównej wersji.
Taka dodatkowa informacja może zostać wykorzystana do generowania różnego rodzaju ostrzeżeń np. w kompilatorze lub IDE.
Przykładowo, IntelliJ wykryje takie metody i oznaczy je innym kolorem, żeby jeszcze wyraźniej dać nam znać, że coś tutaj jest nie tak 🙂
➡ ZOBACZ 👉: Semantic Versioning – wersjonowanie semantyczne: prosty sposób na oznaczanie wersji oprogramowania
Dlaczego NIE korzystać z kodu oznaczonego jako @Deprecated ?
Niby wszystko jasne. Wiemy, że dany kod nie jest może najnowszy, ktoś oznaczył go jako @Deprecated – ALE! On jednak jest i działa! Co wtedy robić i czy rzeczywiście nie powinienem nigdy, przenigdy z niego skorzystać?
Oczywiście, że możesz z niego skorzystać, ale robisz to na własną odpowiedzialność 🙂
Co w takim razie nam grozi?
- Brak wsparcia dla danego fragmentu kodu – autor wyraźnie dał nam znać, żeby z niego nie korzystać, więc raczej nie będzie się przykładał do jego aktualizacji
- Utrudniona aktualizacja zależności – jest duża szansa, że przy najbliższej okazji, gdy spróbujemy zaktualizować daną zależność rzeczonej metody, może jej już tam nie być!
- Ryzyka związane z mniejszym bezpieczeństwem – stary kod to zazwyczaj mniej bezpieczny kod
Dlatego, o ile to możliwe warto trzymać się najnowszych wersji bibliotek i unikać metod oznaczonych jako @Deprecated, nie popadajmy jednak w paranoję w tej kwestii 🙂
Deprecated – Podsumowanie
Dzięki adnotacji @Deprecated możemy oznaczyć wybrany fragment kodu, jako przestarzały, co niewątpliwie pomaga w komunikacji z innymi developerami. A długoterminowo może przyczynić się do mniejszej ilości problemów np. przy aktualizacji zależności.
Deprecjacja jest ważnym mechanizmem, który pozwala na rozwój i ulepszanie języka Java oraz bibliotek i frameworków. Dlatego też programiści powinni być świadomi jej znaczenia i dostosowywać swój kod do nowszych wersji.
Powodzenia w Waszych aktualizacjach!
Tomek
20+ BONUSOWYCH materiałów z programowania
e-book – „8 rzeczy, które musisz wiedzieć, żeby dostać pracę jako programista”,
e-book – „Java Cheat Sheet”,
checklista – „Pytania rekrutacyjne”
i wiele, wiele wiecej!