{"id":541,"date":"2021-03-07T14:00:00","date_gmt":"2021-03-07T13:00:00","guid":{"rendered":"https:\/\/blog.lantkowiak.pl\/?p=541"},"modified":"2021-03-10T00:03:40","modified_gmt":"2021-03-09T23:03:40","slug":"nowosci-w-java-15","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/","title":{"rendered":"Nowo\u015bci w Java 15"},"content":{"rendered":"\n<p>Ostatnio omawiali\u015bmy <a href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/02\/28\/rozwoj-klasy-string-w-java-od-wersji-8-do-15\/\">rozw\u00f3j klasy String w Javie od wersji 8 do 15<\/a>. Wspominali\u015bmy tam, \u017ce w Javie 15 zosta\u0142y dodane 3 nowe metody do klasy String. Oczywi\u015bcie to nie s\u0105 wszystkie nowo\u015bci w tej wersji Javy. Dzisiaj przyjrzymy si\u0119 jakie inne nowo\u015bci mo\u017cemy u\u017cywa\u0107 w Java od wersji 15.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Algorytm podpisu cyfrowego<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"450\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-1024x450.png\" alt=\"Edwards-Curve Digital Signature Algorithm\" class=\"wp-image-566\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-1024x450.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-300x132.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-768x338.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-1536x676.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-973x428.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image-508x223.png 508w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/03\/image.png 1810w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pierwsz\u0105 zmian\u0105, opisan\u0105 po numerem <a href=\"https:\/\/openjdk.java.net\/jeps\/339\">JEP 339<\/a>, jest nowy algorytm podpisu cyfrowego oparty na krzywych eliptycznych. Jego oryginalna nazwa to <em>Edwards-Curve Digital Signature Algorithm<\/em>, a w skr\u00f3cie <em>EdDSA<\/em>.<\/p>\n\n\n\n<p>Poni\u017cej zobaczmy jak mo\u017cemy wykorzysta\u0107 nowy algorytm w naszym kodzie i przyk\u0142adowy wynik.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">KeyPairGenerator keyPairGenerator = KeyPairGenerator.<em>getInstance<\/em>(\"EdDSA\");\nKeyPair keyPair = keyPairGenerator.generateKeyPair();\n\nPublicKey publicKey = keyPair.getPublic();\nPrivateKey privateKey = keyPair.getPrivate();\n\nSystem.<em>out<\/em>.println(Arrays.<em>toString<\/em>(publicKey.getEncoded()));\nSystem.<em>out<\/em>.println(Arrays.<em>toString<\/em>(privateKey.getEncoded()));<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">[48, 42, 48, 5, 6, 3, 43, 101, 112, 3, 33, 0, 53, -105, 68, 17, -24, 121, -109, 99, -12, 119, 6, -41, -15, -70, 86, -111, -74, 107, -67, 79, -61, 0, 87, 118, -35, -95, -9, 108, 87, -123, -61, 54]\n[48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32, 70, -23, -62, -45, -124, 28, 89, 127, 51, -71, -17, -31, -26, 48, 82, -100, -47, 23, -48, 103, 123, 49, 90, 66, 43, -116, -28, 15, 42, 121, -1, -119]<\/pre>\n\n\n\n<p>Przy ka\u017cdym uruchomieniu powy\u017cszego kodu oczywi\u015bcie jest generowana nowa para kluczy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zapiecz\u0119towane klasy<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn.pixabay.com\/photo\/2017\/09\/12\/15\/36\/letters-2742643_960_720.jpg\" alt=\"Sealed Classes\"\/><\/figure>\n\n\n\n<p>Kolejn\u0105 nowo\u015bci\u0105 s\u0105 <em>Sealed Classes<\/em>, kt\u00f3re s\u0105 opisane pod <a href=\"https:\/\/openjdk.java.net\/jeps\/360\">JEP 360<\/a>.  Jest to feature oznaczony jako <em>Preview<\/em>, oznacza to, \u017ce ostateczna wersja tej funkcjonalno\u015bci mo\u017ce jeszcze ulec zmianie.<\/p>\n\n\n\n<p>Standardowo, kiedy tworzymy klasy, kt\u00f3rych nie oznaczamy jako <em>final<\/em> to mog\u0105 by\u0107 dziedziczone przez dowoln\u0105 inn\u0105 klas\u0119 (zak\u0142adaj\u0105c, \u017ce modyfikator dost\u0119pu pozwala na dost\u0119p do niej). <\/p>\n\n\n\n<p>Mechanizm <em>Sealed Classes<\/em>  pozwala na stworzenie zamkni\u0119tej hierarchii klas, czyli takiej, kt\u00f3ra nie b\u0119dzie mog\u0142a by\u0107 rozbudowana. Mo\u017ce to by\u0107 u\u017cyteczne, kiedy chcemy stworzy\u0107 hierarchie klas, kt\u00f3ra nie powinna by\u0107 rozszerzana np. w ramach jednego modu\u0142u.<\/p>\n\n\n\n<p>Sprawd\u017amy zatem w jaki spos\u00f3b mo\u017cemy zaimplementowa\u0107 nasz\u0105 'zapiecz\u0119towan\u0105&#8217; hierarchie.<\/p>\n\n\n\n<p>Na pocz\u0105tku musimy zadeklarowa\u0107 nasz\u0105 klas\u0119 bazow\u0105 wraz z wszystkimi klasami, kt\u00f3re po niej bezpo\u015brednio dziedzicz\u0105.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">sealed class Vehicle\n      permits Bike, Car, Boat {\n}<\/code><\/pre>\n\n\n\n<p>W powy\u017cszym kodzie pojawiaj\u0105 si\u0119 dwa nowe s\u0142owa kluczowe <em>sealed<\/em> i <em>permits<\/em>. Pierwszym s\u0142owem oznaczamy, \u017ce nasza klasa b\u0119dzie 'zapiecz\u0119towana&#8217; czyli dziedziczona tylko przez okre\u015blone klasy. Po drugim s\u0142owie kluczowym musimy wylistowa\u0107 wszystkie dziedzicz\u0105ce klasy. <\/p>\n\n\n\n<p>Teraz zaimplementujmy nasze 3 klasy, kt\u00f3re zdefiniowali\u015bmy wcze\u015bniej.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">final class Bike extends Vehicle {}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">non-sealed class Boat extends Vehicle {}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">sealed class Car extends Vehicle\n      permits Audi {}<\/code><\/pre>\n\n\n\n<p>To co mo\u017cemy od razu zauwa\u017cy\u0107 to 3 r\u00f3\u017cne sposoby jak klasy s\u0105 zdefiniowane. Klasy dziedzicz\u0105ce po 'zapiecz\u0119towanej&#8217; klasie musz\u0105 mie\u0107 jedno z poni\u017cszych s\u0142\u00f3w kluczowych w swojej definicji:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>final<\/em> &#8211; oznaczamy w ten spos\u00f3b, \u017ce po klasie nie b\u0119dzie mo\u017cna dziedziczy\u0107,<\/li><li><em>non-sealed<\/em> &#8211; oznaczamy w ten spos\u00f3b, \u017ce po klasie b\u0119dzie mo\u017cna dziedziczy\u0107, czyli w przypadku normalnej klasy jest to odpowiednik klasy <strong>bez<\/strong> s\u0142owa kluczowego <em>final<\/em>,<\/li><li><em>sealed<\/em> &#8211; w ten spos\u00f3b rozpoczynamy now\u0105 hierarchie klas czyli r\u00f3wnie\u017c musimy zdefiniowa\u0107 klasy dziedzicz\u0105ce po s\u0142owie  <em>permits<\/em>.<\/li><\/ul>\n\n\n\n<p>Jeszcze na koniec spr\u00f3bujmy stworzy\u0107 klas\u0119, kt\u00f3ra dziedziczy po klasie <em>Vehicle<\/em>, ale nie zosta\u0142a zdefiniowana w hierachii.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">class Train extends Vehicle {}<\/code><\/pre>\n\n\n\n<p>Przy pr\u00f3bie kompilacji powy\u017cszego kodu otrzymamy nast\u0119puj\u0105ce b\u0142\u0105d:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">java: class is not allowed to extend sealed class: Vehicle<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ukryte klasy<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/images.unsplash.com\/photo-1483193722442-5422d99849bc?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&amp;ixlib=rb-1.2.1&amp;auto=format&amp;fit=crop&amp;w=1000&amp;q=80\" alt=\"Hidden Classes\"\/><\/figure>\n\n\n\n<p>Nast\u0119pn\u0105 now\u0105 funkcjonalno\u015bci\u0105, o kt\u00f3rej sobie powiemy s\u0105 <em>Hidden Classes<\/em>, o kt\u00f3rych mo\u017cemy poczyta\u0107 w tym dokumencie:  <a href=\"https:\/\/openjdk.java.net\/jeps\/371\">JEP 371<\/a>.<\/p>\n\n\n\n<p>Mechanizm ten, pozwala nam zdefiniowa\u0107 klasy, kt\u00f3re nie b\u0119d\u0105 mog\u0142y by\u0107 u\u017cyte przez bytecode innych klas. Ide\u0105, kt\u00f3ra stoi za ukrytymi klasami jest umo\u017cliwienie framework-om czy j\u0119zykom na JVM generowanie klas w czasie wykonania programu (<em>Runtime<\/em>) i u\u017cywanie ich przez refleksje.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usuni\u0119cie silnika JavaScriptu<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn.pixabay.com\/photo\/2016\/03\/28\/09\/41\/rhinoceros-1285199_960_720.jpg\" alt=\"Nashorn\"\/><\/figure>\n\n\n\n<p>Kolejn\u0105 zmian\u0105, o kt\u00f3rej mo\u017cna poczyta\u0107 <a href=\"https:\/\/openjdk.java.net\/jeps\/372\">tutaj<\/a>, jest usuni\u0119cie silnika JavaScriptu &#8211; Nashorn, kt\u00f3ry by\u0142 oznaczony jako <em>deprecated<\/em>, od Javy 11. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wy\u0142\u0105czenie Biased Locking<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/images.unsplash.com\/photo-1514820402329-de527fdd2e6d?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&amp;ixlib=rb-1.2.1&amp;auto=format&amp;fit=crop&amp;w=1000&amp;q=80\" alt=\"Biased Locking\"\/><\/figure>\n\n\n\n<p>Biased Locking jest pewn\u0105 optymalizacj\u0105, kt\u00f3ra wyst\u0119puje przy synchronizacji. JVM jest w stanie wykry\u0107 czy synchronizowany obiekt jest u\u017cywany tylko przez jeden w\u0105tek. Je\u017celi tak, to JVM jest w stanie wykona\u0107 kolejne operacje na tym obiekcie bez ponoszenia koszt\u00f3w zwi\u0105zanych z synchronizacj\u0105.<\/p>\n\n\n\n<p>Do Javy 15 mechanizm ten by\u0142 domy\u015blnie w\u0142\u0105czony. Od wersji 15 zosta\u0142 on wy\u0142\u0105czony, a dodatkowo sam mechanizm zosta\u0142 oznaczony jako <em>deprecated<\/em>.<\/p>\n\n\n\n<p>Wi\u0119cej informacji na ten temat mo\u017cemy znale\u017a\u0107 w <a href=\"https:\/\/openjdk.java.net\/jeps\/374\">JEP 374<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dopasowanie wzorca dla instanceof<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn.pixabay.com\/photo\/2018\/12\/16\/20\/36\/math-3879310_960_720.jpg\" alt=\"Pattern Matching for instanceof\"\/><\/figure>\n\n\n\n<p>Kolejna zmiana w Java 15, kt\u00f3ra jest opisana w <a href=\"https:\/\/openjdk.java.net\/jeps\/375\">JEP 375<\/a>, to <em>Pattern Matching for instanceof<\/em>. Funkcjonalno\u015b\u0107 pojawi\u0142a si\u0119 poraz pierwszy w Javie 14 i by\u0142a oznaczona jako <em>Preview<\/em>. Obecnie funkcjonalno\u015b\u0107 oznaczona jest jako<em> Second Preview<\/em>.<\/p>\n\n\n\n<p>T\u0105 funkcjonalno\u015b\u0107 naj\u0142atwiej b\u0119dzie wyt\u0142umaczy\u0107 na przyk\u0142adzie, zatem od razu do niego przechodzimy \ud83d\ude42<\/p>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy stworzy\u0107 metod\u0119, kt\u00f3ra przyjmuje jeden parametr i zwraca jego rozmiar. Haczyk tkwi w parametrze, kt\u00f3ry mo\u017ce by\u0107 zar\u00f3wno Stringiem jak i list\u0105.<\/p>\n\n\n\n<p>Napiszmy wi\u0119c tak\u0105 metod\u0119 bez u\u017cywania nowego mechanizmu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">static int getSize(Object obj) {\n   if (obj instanceof String) {\n      return ((String) obj).length();\n   } else if (obj instanceof List) {\n      return ((List&lt;?&gt;) obj).size();\n   }\n   return 0;\n}<\/code><\/pre>\n\n\n\n<p>Poniewa\u017c chcemy, \u017ceby nasza metoda by\u0142a uniwersalna to musimy przyj\u0105\u0107 <em>Object<\/em> jako parametr. Nast\u0119pnie dla ka\u017cdego obs\u0142ugiwanego typu robimy sprawdzenie typu u\u017cywaj\u0105c <em>instanceof<\/em>, a nast\u0119pnie robimy jawne rzutowanie na dany typ, na kt\u00f3rym wywo\u0142ujemy metod\u0119 odpowiedzialn\u0105 za wyliczenie rozmiaru dla tego typu, czyli np. <em>String.length()<\/em> czy <em>List.size()<\/em>.<\/p>\n\n\n\n<p>Teraz pora na podobn\u0105 metod\u0119, ale u\u017cywaj\u0105c mechanizmu Pattern Matching.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">static int getSize(Object obj) {\n   if (obj instanceof String str) {\n      return str.length();\n   } else if (obj instanceof List&lt;?&gt; list) {\n      return list.size();\n   }\n   return 0;\n}<\/code><\/pre>\n\n\n\n<p>Tutaj podobnie jak poprzednio przyjmujemy <em>Object<\/em> jako parametr, a nast\u0119pnie mo\u017cemy zauwa\u017cy\u0107 u\u017cycie nowego mechanizmu. Przy sprawdzaniu typu obiektu przy pomocy <em>instanceof<\/em>, po podaniu typu, do kt\u00f3rego por\u00f3wnujemy (np. String czy List w naszym przyk\u0142adzie) podajemy nazw\u0119 zmiennej, pod kt\u00f3r\u0105 b\u0119dzie dost\u0119pny nasz parametr rzutowany ju\u017c na dany typ. Dzi\u0119ki temu w danym bloku if&#8217;a mo\u017cemy u\u017cywa\u0107 nowej zmiennej i wywo\u0142ywa\u0107 na niej metody odpowiednie dla danego typu bez konieczno\u015bci robienia jawnego rzutowania. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nowy algorytm Garbage Collector<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn.pixabay.com\/photo\/2015\/05\/17\/18\/25\/playmobil-771313_960_720.jpg\" alt=\"Z Garbage Collector\"\/><\/figure>\n\n\n\n<p>Kolejn\u0105 nowo\u015bci\u0105, kt\u00f3ra jest opisana po numerem <a href=\"https:\/\/openjdk.java.net\/jeps\/375\">JEP 377<\/a>, jest nowy algorytm Garbage Collectora nazwany <em>Z Garbage Collector<\/em>. Nowy mechanizm zosta\u0142 wprowadzony ju\u017c w Javie 11, ale jako funkcjonalno\u015b\u0107 eksperymentalna.<\/p>\n\n\n\n<p>G\u0142\u00f3wnymi cechami nowego algorytmu maj\u0105 by\u0107 ma\u0142e op\u00f3\u017anienia (max 10ms) przy jednoczesnej obs\u0142udze Stos\u00f3w (<em>Heap<\/em>) o rozmiarach mierzonych w terabajtach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bloki Tekstowe<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn.pixabay.com\/photo\/2015\/07\/15\/11\/53\/woodtype-846089_960_720.jpg\" alt=\"Text Blocks\"\/><\/figure>\n\n\n\n<p>Nast\u0119pn\u0105 funkcjonalno\u015bci\u0105 s\u0105 Bloki Tekstowe (<em>Text Blocks<\/em>) oznaczone <a href=\"https:\/\/openjdk.java.net\/jeps\/375\">JEP 378<\/a>. Funkcjonalno\u015b\u0107 zosta\u0142a wprowadzona w Java 13 (<em>Preview<\/em>), a nast\u0119pnie w Java 14 jako <em>Second Preview<\/em>.<\/p>\n\n\n\n<p>Bloki tekstowe pozwalaj\u0105 nam stworzy\u0107 wielolinijkowe Stringi w wygodny spos\u00f3b. Poni\u017cej sprawd\u017amy przyk\u0142ad takiego bloku oraz wynik tego fragmentu kodu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">String text = \"\"\"<br>      Lorem ipsum dolor sit amet,<br>      consectetur adipiscing elit.<br>      Donec rutrum ac lectus sed rhoncus.<br>      \"\"\";<br>System.<em>out<\/em>.println(text);<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">Lorem ipsum dolor sit amet,<br>consectetur adipiscing elit.<br>Donec rutrum ac lectus sed rhoncus.<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kolejny Garbage Collector<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/gray-whsv-prod.cdn.arcpublishing.com\/resizer\/qlFimZiWINo06u5CG8Am55EvdwM=\/1200x675\/smart\/cloudfront-us-east-1.images.arcpublishing.com\/gray\/HJCBHINVV5NOBPDAUT2GCDZ6GY.png\" alt=\"Shenandoah\"\/><\/figure>\n\n\n\n<p>I po raz kolejny w zestawieniu mamy algorytm Garbage Collector. Jest to finalna wersja algorytmu, kt\u00f3rego pierwsza wersja zosta\u0142a wprowadzona w Java 11. Algorytm <em>Shenandoah<\/em> zosta\u0142 opisany pod numerem <a href=\"https:\/\/openjdk.java.net\/jeps\/379\">JEP 379<\/a>.<\/p>\n\n\n\n<p>Algorytm dzia\u0142a na podobnej zasadzie jak G1, z tym \u017ce wykonuje operacje kompaktowania r\u00f3wnie\u017c w spos\u00f3b wsp\u00f3\u0142bie\u017cny.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usuni\u0119cie SOLARISa<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/tadviser.com\/images\/thumb\/9\/9d\/Oracle_Solaris_logo.png\/840px-Oracle_Solaris_logo.png\" alt=\"SOLARIS\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/openjdk.java.net\/jeps\/381\">JEP 381<\/a> to oznaczenie kolejnej zmiany w Java 15, kt\u00f3r\u0105 jest usuni\u0119cie kodu zwi\u0105zanego z systemem operacyjnym SOLARIS oraz architektur\u0105 SPARC.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">API do pami\u0119ci zewn\u0119trznej<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/images.unsplash.com\/photo-1542978709-19c95dc3bc7e?ixlib=rb-1.2.1&amp;ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&amp;auto=format&amp;fit=crop&amp;w=1000&amp;q=80\" alt=\"Foreign-Memory Access API\"\/><\/figure>\n\n\n\n<p>Kolejn\u0105 nowo\u015bci\u0105 oznaczon\u0105 jako<a href=\"https:\/\/openjdk.java.net\/jeps\/383\"> JEP 383<\/a> jest API dost\u0119pu do pami\u0119ci zewn\u0119trznej (<em>Foreign-Memory Access API<\/em>). Feature jest oznaczony jako <em>Second Incubator<\/em>, czyli jest to funkcjonalno\u015b\u0107, kt\u00f3ra jeszcze nie jest w pe\u0142ni sko\u0144czona, mo\u017ce by\u0107 zmieniona czy nawet usuni\u0119ta w przysz\u0142ych wersjach Javy.<\/p>\n\n\n\n<p>Nowe API dostarcza bezpieczny i wydajny spos\u00f3b dost\u0119pu do pami\u0119ci, zar\u00f3wno Heapa jak i pami\u0119ci natywnej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rekordy<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/images.pexels.com\/photos\/3920847\/pexels-photo-3920847.jpeg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260\" alt=\"Records\"\/><\/figure>\n\n\n\n<p>Kolejna, przedostatnia ju\u017c nowo\u015b\u0107, to Rekordy (<em>Records<\/em>) oznaczone numerem <a href=\"https:\/\/openjdk.java.net\/jeps\/384\">JEP 384<\/a>. Feature jest oznaczony jako Second Preview czyli mog\u0105 w nim zosta\u0107 wprowadzone jeszcze jakie\u015b zmiany, ale nie powinni\u015bmy spodziewa\u0107 si\u0119 rewolucji \ud83d\ude42<\/p>\n\n\n\n<p>Rekordy s\u0105 mechanizmem, kt\u00f3ry pozwala nam stworzy\u0107 Data Class, czyli klas\u0119 kt\u00f3ra zawiera pola wraz metoda dost\u0119powymi do nich, implementacje metod <em>equals<\/em>, <em>hashCode<\/em> oraz <em>toString<\/em>. Je\u017celi u\u017cywali\u015bmy wcze\u015bnie biblioteki <a href=\"https:\/\/projectlombok.org\/\">lombok<\/a> to mogli\u015bmy to osi\u0105gn\u0105\u0107 przez u\u017cycie <a href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/03\/06\/adnotacje-w-javie\/\">adnotacji<\/a> @Data na klasie.<\/p>\n\n\n\n<p>Sp\u00f3jrzmy zatem na przyk\u0142adow\u0105 implementacje rekordu oraz jego u\u017cycia.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">record Point(int x, int y) {}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">Point p = new Point(1, 3);\n\nSystem.<em>out<\/em>.println(\"p.x() = \" + p.x());\nSystem.<em>out<\/em>.println(\"p.y() = \" + p.y());\nSystem.<em>out<\/em>.println(\"p = \" + p);<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">p.x() = 1\np.y() = 3\np = Point[x=1, y=3]<\/pre>\n\n\n\n<p>Jak widzimy implementacja Rekordu polega na u\u017cyciu s\u0142owa kluczowe <em>records<\/em> zamiast <em>class<\/em> oraz zdefiniowaniu p\u00f3l w nag\u0142\u00f3wku klasy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Oznaczenie&nbsp;RMI Activation jako do usuni\u0119cia<\/h3>\n\n\n\n<p>Ostatni\u0105 zmian\u0105, kt\u00f3ra nast\u0119puj\u0119 w Java 15, jest oznaczenie mechanizmu RMI Activation jako <em>deprecated<\/em> z informacj\u0105, \u017ce b\u0119dzie usuni\u0119ty w przysz\u0142o\u015bci. Zmiana ta jest oznaczona numerem <a href=\"https:\/\/openjdk.java.net\/jeps\/385\">JEP 385<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Dzisiaj przyjrzeli\u015bmy si\u0119 wszystkim zmianom i nowo\u015bci\u0105 w Java 15. Cz\u0119\u015b\u0107 z nich prawdodpobnie nie wp\u0142ynie na nasz\u0105 codzienn\u0105 prac\u0119, lecz z pewno\u015bci\u0105 funkcjonalno\u015bci takie jak Rekordy, Bloki Tekstowe czy Dopasowanie Wzorca dla <em>instanceof<\/em> mog\u0105 u\u0142atwi\u0107 nasze codzienne obcowanie z now\u0105 wersj\u0105 Javy \ud83d\ude42 <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ostatnio omawiali\u015bmy rozw\u00f3j klasy String w Javie od wersji 8 do 15. Wspominali\u015bmy tam, \u017ce w Javie 15 zosta\u0142y dodane 3 nowe metody do klasy String. Oczywi\u015bcie to&#8230;<\/p>\n","protected":false},"author":1,"featured_media":542,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[42],"class_list":["post-541","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-15"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nowo\u015bci w Java 15 - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"description\" content=\"W artykule poznamy nowo\u015bci, kt\u00f3re zosta\u0142y wprowadzone w Java 15. Zapoznamy si\u0119 z takimi funkcjonalno\u015bciami jak Sealed Classes czy Pattern Matching.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nowo\u015bci w Java 15 - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"W artykule poznamy nowo\u015bci, kt\u00f3re zosta\u0142y wprowadzone w Java 15. Zapoznamy si\u0119 z takimi funkcjonalno\u015bciami jak Sealed Classes czy Pattern Matching.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-07T13:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-09T23:03:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/02\/dsa-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"759\" \/>\n\t<meta property=\"og:image:height\" content=\"303\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/\",\"name\":\"Nowo\u015bci w Java 15 - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2021-03-07T13:00:00+00:00\",\"dateModified\":\"2021-03-09T23:03:40+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"description\":\"W artykule poznamy nowo\u015bci, kt\u00f3re zosta\u0142y wprowadzone w Java 15. Zapoznamy si\u0119 z takimi funkcjonalno\u015bciami jak Sealed Classes czy Pattern Matching.\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nowo\u015bci w Java 15\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nowo\u015bci w Java 15 - Lukasz Antkowiak&#039;s blog","description":"W artykule poznamy nowo\u015bci, kt\u00f3re zosta\u0142y wprowadzone w Java 15. Zapoznamy si\u0119 z takimi funkcjonalno\u015bciami jak Sealed Classes czy Pattern Matching.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/","og_locale":"pl_PL","og_type":"article","og_title":"Nowo\u015bci w Java 15 - Lukasz Antkowiak&#039;s blog","og_description":"W artykule poznamy nowo\u015bci, kt\u00f3re zosta\u0142y wprowadzone w Java 15. Zapoznamy si\u0119 z takimi funkcjonalno\u015bciami jak Sealed Classes czy Pattern Matching.","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2021-03-07T13:00:00+00:00","article_modified_time":"2021-03-09T23:03:40+00:00","og_image":[{"width":759,"height":303,"url":"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2021\/02\/dsa-1.png","type":"image\/png"}],"author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"9 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/","name":"Nowo\u015bci w Java 15 - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2021-03-07T13:00:00+00:00","dateModified":"2021-03-09T23:03:40+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"description":"W artykule poznamy nowo\u015bci, kt\u00f3re zosta\u0142y wprowadzone w Java 15. Zapoznamy si\u0119 z takimi funkcjonalno\u015bciami jak Sealed Classes czy Pattern Matching.","breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2021\/03\/07\/nowosci-w-java-15\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Nowo\u015bci w Java 15"}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=541"}],"version-history":[{"count":30,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/541\/revisions"}],"predecessor-version":[{"id":573,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/541\/revisions\/573"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media\/542"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}