1. Historia wersji Javy

Historia Javy zaczyna się w 1991 roku, kiedy grupa programistów firmy Sun postanowiła stworzyć język dla małych urządzeń: pilotów do telewizorów, ekspresów do kawy, tosterów, kart bankowych i tak dalej.

Producenci tych urządzeń używali bardzo różnych procesorów do sterowania swoimi produktami, dlatego bardzo ważne stało się powiązanie z architekturą konkretnego procesora lub systemu operacyjnego.

Twórcy Javy postanowili podzielić problem na dwie części: ich programy byłyby kompilowane nie do kodu maszynowego dla określonego procesora, ale do specjalnego kodu pośredniego. Z kolei ten pośredni kod byłby wykonywany przez specjalny program zwany maszyną wirtualną .

Większość programistów nazywa komputer maszyną.

Ciekawy.

C++ został przyjęty jako podstawa języka Java i został znacznie uproszczony i ustandaryzowany. Jeśli C++ pozwala ci zrobić coś na 10 sposobów, to Java zachowała tylko jeden z nich. W pewnym sensie przypominało to przejście od hieroglifów do alfabetu.

Pierwsza wersja Javy została wydana w 1996 roku. Od tego czasu Java rozpoczęła swój triumfalny marsz dookoła świata, co z kolei stymulowało ewolucję i rozwój samego języka. Obecnie w Javie napisano miliony bibliotek i miliardy wierszy kodu, a co 6 miesięcy wydawane są nowe wersje Javy:

Nazwa Rok Liczba zajęć
JDK 1.0 1996 211
JDK 1.1 1997 477
J2SE 1.2 1998 1524
J2SE 1.3 2000 1840
J2SE 1.4 2002 2723
J2SE 5.0 2004 3279
Java SE 6 2006 3793
JavaSE7 2011 4024
Java SE 8 2014 4240
JavaSE9 2017 6005
Java SE 10 2018 6002
Java SE 11 2018 4411
JavaSE 12 2019 4433
Java SE 13 2019 4515

Chociaż wersje Javy były wydawane regularnie, nie wszystkie miały takie samo znaczenie dla programistów: Java ewoluowała z przerwami.


2. Jawa 2

Pierwszy duży skok naprzód nastąpił wraz z wydaniem JDK 1.2. Zawierała tak wiele innowacji, że twórcy Javy zmienili jej nazwę na Java 2 Platform Standard Edition lub w skrócie J2SE 1.2.

Głównymi innowacjami były:

  • strictfpsłowo kluczowe
  • Biblioteka Swing do pracy z grafiką
  • Kompilator JIT, który przyspieszył wykonywanie programów Java
  • Ogromny zestaw kolekcji
  • Pełna obsługa Unicode: japoński, chiński i koreański.

Dziś te innowacje nie wydają się tak duże, ale każdy duży projekt wyrasta z małego. Java nie byłaby dziś tak popularna, gdyby niewielka grupa programistów nie ulepszała języka 20 lat temu.


3. Jawa 5

JDK 1.5 został wydany we wrześniu 2004 roku. Wprowadził również wiele innowacji, więc nie mógł nie zasłużyć na nową nazwę: zamiast wersji 1.5, 1.6 i 1.7 postanowili użyć wersji 5.0, 6.0 i 7.0. Tak więc pełna nazwa JDK 1.5 brzmiała Java 2 Standard Edition 5.0

Ta aktualizacja zawierała rzeczy, bez których dalszy rozwój języka nie byłby możliwy.

Adnotacje . Połowa głównych nowoczesnych frameworków jest zbudowana na adnotacjach, od Springa i Hibernate po JUnit.

Generyki . Leki generyczne podniosły moc kolekcji (i nie tylko) na nowy poziom. Kod stał się prostszy, bardziej zwarty i bezpieczniejszy.

Autoboxing/unboxing to automatyczna konwersja między typami pierwotnymi a ich typami opakowań. To znacznie ułatwiło pisanie i odczytywanie kodu, a kolekcje stały się jeszcze bardziej popularne.

Pętla stanowi teraz co najmniej połowę wszystkich pętli tworzonych przez programistów foreach. I oczywiście jest niezbędny podczas pracy z kolekcjami.

Enum to kolejna fajna nowa funkcja. Pozwala pięknie uprościć wiele rzeczy.

To nie wszystkie innowacje: dodano setki nowych klas. Ważne jest to, że były to właściwe innowacje i dały kolejny potężny impuls do popularności Javy.


4. Jawa 6

Java 6 jest pamiętana z dużej liczby drobnych ulepszeń i rezygnacji z liczby 2 w nazwie: nie była to już „Java 2 Standard Edition 6.0”, ale po prostu „Java Standard Edition 6.0”.

Oto kilka ciekawych innowacji:

Java Compiler API umożliwiło wywołanie kompilatora Java bezpośrednio z kodu. Oznacza to, że Twój program może teraz wygenerować tekst reprezentujący kod klasy, skompilować go, wywołując metody Java Compiler API , a następnie natychmiast rozpocząć wywoływanie metod skompilowanej klasy. Istnieją całe obszary rozwoju, w których ta umiejętność znacznie upraszcza życie.

Możliwe stało się wykonywanie JavaScript bezpośrednio w programie Java. Ta funkcja pojawiła się, ponieważ JavaSE 6 zawierał silnik Rhino JavaScript.


5. Jawa 7

Java 7 została wydana w lipcu 2011 roku. Miało być w niej wiele usprawnień, ale programistom udało się dodać tylko niewielką część tego, co było zaplanowane. W szczególności dodali takie rzeczy jak:

Nowa biblioteka do pracy z danymi wejściowymi i wyjściowymi. Znany jako nowy interfejs API wejścia i wyjścia , znajduje się w java.niopakiecie.

Automatyczne wnioskowanie o typie kompilatora Java w czasie kompilacji pozwala programistom pisać mniej kodu. Kompilator stał się mądrzejszy, a to był dopiero początek.

Instrukcja switch zyskała możliwość używania łańcuchów znaków jako wielkości liter.

Automatyczne zarządzanie zasobami również uległo znacznej poprawie: dzięki tej try-with-resourceskonstrukcji program Java może zamykać strumienie danych, gdy nie są już potrzebne.

Było wiele innych zmian, ale nie są one tak ważne na naszym obecnym etapie nauki Javy.


6. Jawa 8

Java 8 pojawiła się w marcu 2014 roku i była najsilniejszą ostatnią aktualizacją Javy.

Programiści pamiętają go przede wszystkim z powodu dodania wyrażeń lambda i interfejsów funkcyjnych (adnotacja @FunctionalInterface). Zbadamy je na poziomie 21. Twój kod już nigdy nie będzie taki sam.

Dodano również strumienie dla kolekcji, co w połączeniu z wyrażeniami lambda umożliwiło pisanie kodu w dużo bardziej zwarty sposób. Chociaż nie zawsze jest o wiele bardziej czytelny.

Ciekawy.

Trzecią dużą zmianą było wprowadzenie w Javie 8 zupełnie nowego API do pracy z datami i godzinami — Date Time API . Przestudiujemy to w najbliższej przyszłości.


7. Jawa 9

Java 9 została wydana we wrześniu 2017 roku. Od tego czasu twórcy Javy postanowili wydawać nowe wersje częściej — co pół roku. Zapewne byli pod wrażeniem podejścia, jakie przyjęli twórcy przeglądarki Google Chrome.

Wersja Java 9 skupiała się bardziej na wewnętrznych elementach maszyny Java. Najważniejszą rzeczą, jaką przyniósł zwykłym programistom, była możliwość dzielenia programu na moduły. Jest to bardzo wygodne, gdy masz dziesiątki tysięcy klas lub gdy Twój kod dynamicznie rozładowuje wtyczki.

Ale prawdopodobnie w najbliższej przyszłości będzie to dla nas mało przydatne.


8. Jawa 11

Sześć miesięcy po wydaniu Javy 9 pojawiła się Jawa 10, a kolejne sześć miesięcy później ukazała się Jawa 11.

W tym czasie wprowadzono wiele drobnych ulepszeń, ale najprawdopodobniej zapamiętasz tylko dwa:

Dodano obsługę Unicode 10. Teraz możesz używać emotikonów w swoich programach Java. Możesz z nimi pracować w taki sam sposób, jak pracujesz z typem boolowskim:

Udoskonalono wnioskowanie typu i pojawiło się varsłowo kluczowe , które na pewno Ci się spodoba.

Teraz możesz napisać, co następuje:

var str = "Hello";

A kompilator konwertuje to na:

String str = "Hello";

Ale były też pewne straty. Twórcy Javy porzucili biblioteki takie jak JavaFX, Java EE i CORBA z JDK 11.


9. Znaczenie kompatybilności

Gdy pojawia się nowa wersja, programiści często chcą zaczynać od zera. W końcu kto chce naprawiać kilka starych błędów, kiedy są absolutnie pewni, jak kod powinien być napisany od samego początku?

Ale historia nie popiera takiego podejścia. Za każdym razem, gdy programiści wypuszczają nową wersję programu, 90% jego użytkowników korzysta ze starej wersji. Mogą korzystać z nowych funkcji programu lub je ignorować, ale użytkownicy nienawidzą sytuacji, gdy coś, co wcześniej dobrze działało, przestaje działać.

Wiele wspaniałych produktów umarło, gdy programiści wypuścili nowe wersje, które nie były kompatybilne. Lub po prostu, kiedy dokonali poważnych zmian. Na przykład pomysł rezygnacji z przycisku Start w systemie Windows 8 nie spodobał się użytkownikom. Wydanie systemu Windows 10 przywróciło połowę tego, co zostało usunięte w systemie Windows 8.

Co więcej, Windows umożliwia uruchamianie programów napisanych 20 lat temu dla Windows 95, a nawet napisanych 30 lat temu dla MS DOS 3.0 — będą działać. Jest to jeden z powodów, dla których system Windows pozostaje popularny.

A Java nie byłaby tak popularna, gdyby jej twórcy nie dbali o kompatybilność. Za każdym razem, gdy pojawia się nowa wersja maszyny Java, nowa wersja zestawu SDK lub większe zmiany w klasach, cały kod Java napisany od stycznia 1996 roku nadal działa.

Zwykle osiąga się to poprzez dodawanie nowych metod, klas i pakietów, bez usuwania czegokolwiek. Takie podejście ma swoje wady i zalety.

Z jednej strony Java ciągnie za sobą mnóstwo bagażu w postaci starego, nieoptymalnego i niepotrzebnego kodu. Z drugiej strony twój projekt napisany w Javie 11 zawsze może korzystać z biblioteki napisanej w Javie 8, która korzysta z bibliotek napisanych w Javie 5 i Javie 2. Ta mieszanka kodu będzie działać dobrze.

W języku C++ biblioteki skompilowane zarówno dla platform 32-bitowych, jak i 64-bitowych nie mogą być używane w tym samym projekcie. I będziesz miał ogromny ból głowy, jeśli nagle odkryjesz, że chartyp używany w jednej bibliotece używa jednego bajtu, podczas gdy inny używa dwóch bajtów.


10. Przestarzałe

Twórcy Javy postanowili więc niczego nie usuwać, a jedynie dodać nowe klasy i pakiety. Ale w jaki sposób informują programistów, że istnieje nowa, godna alternatywa dla istniejącego nieoptymalnego rozwiązania?

Aby to zrobić, wymyślili adnotację @Deprecated.

Jeśli jakaś metoda lub klasa jest przestarzała, ta adnotacja jest dodawana obok jej deklaracji. Oznacza to, że programiści są zniechęceni do korzystania z kodu.

Nadal możesz używać przestarzałej klasy lub metody, ale nie jest to zalecane.

A jak często ludzie robią rzeczy, które nie są zalecane? Prawie zawsze 🙂

Wiele klas jest przestarzałych od 20 lat — były używane i nadal są używane. Ludzie je znają lub są po prostu wygodne. Istnieje jednak ryzyko, że w pewnym momencie zostaną one usunięte, więc lepiej ich nie używać.

Wszystkie nowoczesne IDE, w tym IntelliJ IDEA, mogą obsłużyć @Deprecatedadnotację. Nazwy przestarzałych klas i metod są wyświetlane przy użyciu formatowania przekreślonego . Coś takiego:

Date date = new Date();
int day = date.getDay();

Przestarzałe klasy są bardzo popularne i często spotykane w kodzie, więc wkrótce przyjrzymy się niektórym z nich.