{"id":16188,"date":"2023-06-09T11:55:42","date_gmt":"2023-06-09T09:55:42","guid":{"rendered":"https:\/\/vived.io\/?p=16188"},"modified":"2023-06-09T11:55:46","modified_gmt":"2023-06-09T09:55:46","slug":"kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/","title":{"rendered":"Kompaktowe om\u00f3wienie &#8222;zamro\u017conej&#8221; listy funkcjonalno\u015bci JDK 21 &#8211; JVM Weekly vol. 138"},"content":{"rendered":"\n<h2 id=\"1-zamrozona-lista-funkcjonalnosci-jdk-21\" data-num=1>1. &#8222;Zamro\u017cona&#8221; lista funkcjonalno\u015bci JDK 21<\/h2>\n\n\n\n<p>Zacznijmy od najwi\u0119kszego og\u0142oszenia.<\/p>\n\n\n\n<p><a href=\"https:\/\/openjdk.org\/projects\/jdk\/21\/\">JDK 21 przesz\u0142o do fazy Rampdown<\/a>. W teorii, etap ten powinien oznacza\u0107 zako\u0144czenie wprowadzania zmian, ale wi\u0119cej na ten temat ujawni\u0119 p\u00f3\u017aniej. Cho\u0107 zdawa\u0142em sobie spraw\u0119 z ogromu OpenJDK 21, finalna lista JEP-\u00f3w dalej wywo\u0142uje moim zdaniem mnie wra\u017cenie.<\/p>\n\n\n\n<p>Z uwagi na liczb\u0119 nowych funkcji, nie mog\u0119 zag\u0142\u0119bia\u0107 si\u0119 w ka\u017cd\u0105 z nich. Postanowi\u0142em wi\u0119c przeprowadzi\u0107 ma\u0142y eksperyment &#8211; zamierzam przedstawi\u0107 ka\u017cd\u0105 funkcj\u0119 w jednym zdaniu oraz poprzez fragment kodu (dla stabilnych funkcjonalno\u015bci).<\/p>\n\n\n\n<p>Dlatego bez zb\u0119dnego przed\u0142u\u017cania, zaczynamy, bo i tak du\u017co przed nami:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Stabilne<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/431\">431: Sequenced Collections<\/a><\/h4>\n\n\n\n<p>W wypadku uporz\u0105dkowanych kolekcji, wprowadzono sp\u00f3jny interfejs do pobierania pierwszego i ostatniego elementu, a tak\u017ce odwracania sekwencji.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface SequencedCollection&lt;E&gt; extends Collection&lt;E&gt; {\n    \/\/ new method\n    SequencedCollection&lt;E&gt; reversed();\n    \/\/ methods promoted from Deque\n    void addFirst(E);\n    void addLast(E);\n    E getFirst();\n    E getLast();\n    E removeFirst();\n    E removeLast();\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/439\">439: Generational ZGC<\/a><\/h4>\n\n\n\n<p>Jako, \u017ce <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/gctuning\/garbage-collector-implementation.html#GUID-71D796B3-CBAB-4D80-B5C3-2620E45F6E5D\">prawdopodobie\u0144stwo konieczno\u015bci &#8222;sprz\u0105tania&#8221; przez GC jest zmniejsza si\u0119 wraz z czasem \u017cycia danego obiektu<\/a>, posiadanie innego pipeline dla kr\u00f3tko i d\u0142ugo \u017cyj\u0105cych obiekt\u00f3w jest standardem w GC, a teraz trafia te\u017c ZGC.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/440\">440: Record Patterns<\/a><\/h4>\n\n\n\n<p>Mo\u017cliwo\u015b\u0107 \u0142atwej destrukturyzacji Rekord\u00f3w, umo\u017cliwiaj\u0105ca wyci\u0105gni\u0119cie z nich konkretnych p\u00f3l, a tak\u017ce u\u017cywanie w pattern matchingu (kolejny JEP).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (obj instanceof Point(int x, int y)) {\n    System.out.println(x+y);\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/441\">441: Pattern Matching for switch<\/a><\/h4>\n\n\n\n<p>Mo\u017cliwo\u015b\u0107 u\u017cycia <code>switch<\/code> do pattern matchingu, z uwzgl\u0119dnieniem zaawansowanych opcji.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static String formatterPatternSwitch(Object obj) {\n    return switch (obj) {\n        case Integer i -&gt; String.format(&quot;int %d&quot;, i);\n        case Long l    -&gt; String.format(&quot;long %d&quot;, l);\n        case Double d  -&gt; String.format(&quot;double %f&quot;, d);\n        case String s  -&gt; String.format(&quot;String %s&quot;, s);\n        default        -&gt; obj.toString();\n    };\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/444\">444: Virtual Threads<\/a><\/h4>\n\n\n\n<p>Wprowadzenie do JVM konceptu w\u0105tk\u00f3w zarz\u0105dzanych nie przez system operacyjny, a przez sam\u0105 maszyn\u0119 wirtualn\u0105.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Thread.builder().virtual().factory();\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/449\">449: Deprecate the Windows 32-bit x86 Port for Removal<\/a><\/h4>\n\n\n\n<p>Goodnight, Sweet Prince<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/451\">451: Prepare to Disallow the Dynamic Loading of Agents<\/a><\/h4>\n\n\n\n<p>W celu zwi\u0119kszenia bezpiecze\u0144stwa Javy, tw\u00f3rcy planuj\u0105 w przysz\u0142o\u015bci zabroni\u0107 \u0142adowania pewnych kategorii Agent\u00f3w Maszyny Wirtualnej bez podania specjalnej flagi.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/452\">452: Key Encapsulation Mechanism API<\/a><\/h4>\n\n\n\n<p>Wprowadzenie do Javy standardowego API pozwalaj\u0105cego na u\u017cycie techniki znanej jako KEM, wykorzystywanej min. w algorytmach kryptografii kwantowej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preview<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/430\">430: String Templates (Preview)<\/a><\/h4>\n\n\n\n<p>Mo\u017cliwo\u015b\u0107 tworzenia w Javie blok\u00f3w tekstu, daj\u0105cych du\u017co wi\u0119ksze mo\u017cliwo\u015bci i bezpiecze\u0144stwo ni\u017c interpolacja string\u00f3w.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JSONObject doc = JSON_VALIDATE.&quot;&quot;&quot;\n        {\n            &quot;name&quot;:    \\{name},\n            &quot;phone&quot;:   \\{phone},\n            &quot;address&quot;: \\{address}\n        };\n        &quot;&quot;&quot;;\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/445\">445: Unnamed Classes and Instance Main Methods (Preview)<\/a><\/h4>\n\n\n\n<p>Zmiana Launch Protocol w Javie, umo\u017cliwiaj\u0105ca pisania mocno uproszczonych klas Java, g\u0142\u00f3wnie na potrzeby edukacji.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void main() {\n    System.out.println(&quot;Hello, World!&quot;);\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/442\">442: Foreign Function &amp; Memory API (Third Preview)<\/a><\/h4>\n\n\n\n<p>Wprowadzenie typowanej interoperacyjno\u015bci z programami napisanymi w C (a w przysz\u0142o\u015bci te\u017c innych j\u0119zyk\u00f3w kompilowanych), a tak\u017ce natywnej pami\u0119ci systemu operacyjnego.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/443\">443: Unnamed Patterns and Variables (Preview)<\/a><\/h4>\n\n\n\n<p>Wprowadzenie do j\u0119zyka wildcard <code>_<\/code>, u\u017cywanego wtedy, gdy nie chcemy w pattern matchingu definiowa\u0107 konkretnej oczekiwanej warto\u015bci\/typu, a tak\u017ce jako hint dla linter\u00f3w, gdy wiemy \u017ce zadeklarowana zmienna jest niepotrzebna.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if(r instanceof Point(_, int y))\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/453\">453: Structured Concurrency (Preview)<\/a><\/h4>\n\n\n\n<p>Zestaw struktur umo\u017cliwiaj\u0105cych zarz\u0105dzanie w\u0105tkami (nie tylko wirtualnymi), a zw\u0142aszcza potencjalnymi b\u0142\u0119dami.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n        Supplier&lt;String&gt;  user  = scope.fork(() -&gt; findUser());\n        Supplier&lt;Integer&gt; order = scope.fork(() -&gt;fetchOrder());\n\n        scope.join().throwIfFailed();\n\n        return new Response(user.get(), order.get());\n    }\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/446\">446: Scoped Values (Preview)<\/a><\/h4>\n\n\n\n<p>Alternatywa dla ThreadLocala, zaprojektowana g\u0142\u00f3wnie z my\u015bl\u0105 o wirtualnych w\u0105tkach.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>final static ScopedValue&lt;...&gt; V = ScopedValue.newInstance();\n\nScopedValue.where(V, &lt;value&gt;).run(() -&gt; {  V.get() });\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Inkubacja<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/448\">448: Vector API (Sixth Incubator)<\/a><\/h4>\n\n\n\n<p>Czekaj\u0105ce na Valhalle API umo\u017cliwiaj\u0105ce operacje wektorowe, udost\u0119pniane przez nowoczesne procesory.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>A na koniec, je\u015bli Wam ma\u0142o, mam dla Was dwa wideo.<\/p>\n\n\n\n<p>Jedno z nich to \u015bwietne opracowanie ze strony kana\u0142u Inside Java, w kt\u00f3rym Nicolai Parlog w 20 minutowym filmiku w szerszym stopniu opisuje ka\u017cdy z JEP-\u00f3w:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"All That is in Java 21?! \ud83d\ude31 - Inside Java Newscast #50\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/qGaUZ1Z34jw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<p>Drugie to dla mnie okazja, aby przemyci\u0107 jeden z moich ulubionych kana\u0142\u00f3w programistycznych na YouTube. Je\u015bli cenicie sobie lekk\u0105, &#8222;memiczn\u0105&#8221; formu\u0142\u0119 opracowa\u0144, to <a href=\"https:\/\/www.youtube.com\/channel\/UCsBjURrPoezykLs9EqgamOA\">Fireship<\/a> zdecydowanie powinien przypa\u015b\u0107 Wam do gustu. Zawarto\u015b\u0107 tego kana\u0142u to przede wszystkim kr\u00f3tkie, poni\u017cej pi\u0119ciominutowe filmy.<\/p>\n\n\n\n<p>Autor skupia si\u0119 na najistotniejszych tematach ze \u015bwiata programowania. Dla mnie zawsze jest to fantastyczny spos\u00f3b na \u015bledzenie nowo\u015bci z obszar\u00f3w poza moj\u0105 g\u0142\u00f3wn\u0105 specjalizacj\u0105, jak na przyk\u0142ad nowe j\u0119zyki programowania czy innowacje typu bazy wektorowe.<\/p>\n\n\n\n<p>Podkre\u015blam to, poniewa\u017c niedawno na kanale Fireship ukaza\u0142o si\u0119 video po\u015bwi\u0119cone JDK 21. Zach\u0119cam do sprawdzenia, czy taki format odpowiada te\u017c&nbsp;Wam. Moim zdaniem, warto da\u0107 mu szans\u0119:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Java is mounting a huge comeback\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Ibjm2KHfymo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<p>PS: Nie wiem czy pami\u0119tacie, ale z tym &#8222;\u017cadnych zmian&#8221; to r\u00f3\u017cnie bywa\u0142o w przesz\u0142o\u015bci. Przy okazji JDK 20 tw\u00f3rcy zapomnieli bowiem wrzuci\u0107 do inkubacji Vector API, kt\u00f3re zosta\u0142o dodane w zasadzie zaraz przed premier\u0105 wydania.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"275\" data-id=\"16192\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/ezgif-3-9da847db29-1.gif\" alt=\"\" class=\"wp-image-16192\"\/><figcaption class=\"wp-element-caption\">Wizualizacja<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>PS2: Je\u015bli chodzi o Structured Concurrency, to za kulisami dzia\u0142o si\u0119 mas\u0119 ciekawych rzeczy i dyskusji, kt\u00f3re my\u015bla\u0142em opisa\u0107 w\u0142a\u015bnie przy okazji oficjalnego opublikowania listy JEP-\u00f3w. Jak ju\u017c wspomnia\u0142em, to okazuje si\u0119 by\u0107 jednak na tyle mocarne, \u017ce temat zostawimy sobie na p\u00f3\u017aniej.<\/p>\n\n\n\n<h2 id=\"2-valhalla-juz-oficjalnie-zamiesza-w-podejsciu-do-nullowalnosci-w-javie\" data-num=2>2. Valhalla ju\u017c oficjalnie zamiesza w podej\u015bciu do Nullowalno\u015bci w Javie<\/h2>\n\n\n\n<p>Dla dynamiki, zmieniamy teraz tempo i zamiast skr\u00f3towo om\u00f3wi\u0107 nadchodz\u0105c\u0105 wersj\u0119, kt\u00f3rej premiera planowana jest na jesie\u0144, porozmawiamy szerzej o tym, co zosta\u0142o zapowiedziane w kontek\u015bcie Valhalli. Data premiery nie jest jeszcze znana, ale kolejne dokumenty sugeruj\u0105, \u017ce zbli\u017camy si\u0119 do finalnego wydania. Brian Goetz podzieli\u0142 si\u0119 <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Design document on nullability and value types<\/a>, kt\u00f3ry podsumowuje nowy etap rozwoju projektu. Zn\u00f3w mo\u017cemy spojrze\u0107 na wyzwania, ale tak\u017ce na nowe mo\u017cliwo\u015bci, kt\u00f3re si\u0119 pojawiaj\u0105. Valhalla wydaje si\u0119 by\u0107 projektem rozwijanym w spos\u00f3b mocno empiryczny.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7-925x1024.png\" alt=\"\" class=\"wp-image-16194\" width=\"463\" height=\"512\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7-925x1024.png 925w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7-271x300.png 271w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7-768x850.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7.png 1028w\" sizes=\"auto, (max-width: 463px) 100vw, 463px\" \/><figcaption class=\"wp-element-caption\">Jest wiele do nauczenia si\u0119 od Javy, je\u017celi chodzi o prawdziwie iteracyjny rozw\u00f3j projektu.<\/figcaption><\/figure><\/div>\n\n\n<p>Je\u015bli nie \u015bledzicie na bie\u017c\u0105co rozwoju Valhalli, mo\u017cliwe, \u017ce umkn\u0105\u0142 Wam fakt, \u017ce w pewnym momencie tw\u00f3rcy zaproponowali sufiksy <code>.val<\/code> i <code>.ref<\/code>. Mia\u0142y one informowa\u0107, czy chcemy u\u017cywa\u0107 danego obiektu jako warto\u015bci, czy jako referencji. To by\u0142o dla mnie najbardziej problematyczne spo\u015br\u00f3d proponowanych zmian, obawia\u0142em si\u0119 bowiem komplikacji sk\u0142adni. Na razie wygl\u0105da na to, \u017ce uda si\u0119 z nich zrezygnowa\u0107. Prace nad rozwojem ca\u0142ego projektu pozwoli\u0142y zredukowa\u0107 r\u00f3\u017cnice mi\u0119dzy typami prymitywnymi a obiektami do dw\u00f3ch fundamentalnych r\u00f3\u017cnic &#8211; posiadania warto\u015bci domy\u015blnej (jak 0 w przypadku int) oraz wsparcia dla nullowalno\u015bci. W kolejnej iteracji prac nad Valhall\u0105, pierwsze z nich zosta\u0142o zaadresowane poprzez koncepcj\u0119 <code>implicit constructors<\/code> dla Value Class.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>value class Complex {\n     private int re;\n     private int im;\n\n     public implicit Complex();\n     public Complex(int re, int im) { ... }\n\n     ...\n}<\/code><\/pre>\n\n\n\n<p>Co do nullowalno\u015bci, pojawi\u0142a si\u0119 propozycja wprowadzenia dw\u00f3ch dodatkowych oznacze\u0144 przy definiowaniu typu &#8211; <code>!<\/code> oznaczaj\u0105cy <em>nie dopuszczamy nulla<\/em> oraz <code>?<\/code> oznaczaj\u0105cy <em>ten obiekt jest nullowalny<\/em>. W skr\u00f3cie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Foo?<\/code> oznacza <em>ten typ zawiera w swoim zbiorze warto\u015bci null<\/em><\/li>\n\n\n\n<li><code>Foo!<\/code> oznacza <em>ten typ nie zawiera w swoim zbiorze warto\u015bci null<\/em><\/li>\n\n\n\n<li><code>Foo<\/code> oznacza \ud83e\udd37\u200d\u2642\ufe0f &#8211; inaczej m\u00f3wi\u0105c, nie okre\u015blony stan nullowalno\u015bci<\/li>\n<\/ul>\n\n\n\n<p>Z czasem, tw\u00f3rcy b\u0119d\u0105 d\u0105\u017cy\u0107 do tego, aby wersja bez odpowiedniej adnotacji przyjmowa\u0142a cechy wariant\u00f3w anotowanych &#8211; na ten moment wydaje si\u0119, \u017ce nieoznaczone <code>Foo<\/code> b\u0119dzie w wi\u0119kszo\u015bci przypadk\u00f3w traktowane jako nienulowalne.<\/p>\n\n\n\n<p>Niestety, weryfikacja powy\u017cszych b\u0119dzie wymaga\u0142a mieszaniny sprawdze\u0144 na poziomie czasu kompilacji i czasu wykonania, b\u0119dzie te\u017c bardzo trudna i na pocz\u0105tku ograniczona &#8211; dodawanie nowych funkcji do istniej\u0105cego j\u0119zyka nigdy nie jest proste, a szczeg\u00f3\u0142owe rozwi\u0105zania zaproponowane przez Briana pokazuj\u0105, jak wiele przypadk\u00f3w trzeba obs\u0142u\u017cy\u0107. Na dow\u00f3d tego, dzie\u0144 po udost\u0119pnieniu <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Design document on nullability and value types<\/a>, na list\u0119 mailingow\u0105 trafi\u0142o <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Briefest summary of today&#8217;s Valhalla+nullness picture<\/a>, b\u0119d\u0105ce destylatem dokumentu. Mimo \u017ce jest to bardzo dobre podsumowanie, aby naprawd\u0119 zrozumie\u0107 istot\u0119 zmian, musia\u0142em przejrze\u0107 oryginalny tekst. Mapa to jednak nie terytorium.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"572\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-8.png\" alt=\"W dniu dzisiejszym\" class=\"wp-image-16196\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-8.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-8-262x300.png 262w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Znam swoje miejsce.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"3-release-radar\" data-num=3>3. Release Radar<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Guava 32.0<\/h3>\n\n\n\n<p>Guava czasy swojej najwi\u0119kszej chwa\u0142y ma ju\u017c chyba za sob\u0105. Wiele z funkcjonalno\u015bci, kt\u00f3re przynosi\u0142a &#8211; w swoim czasie rewolucyjnych &#8211; zosta\u0142o w\u0142\u0105czonych do JDK albo rozwini\u0119te przez wyspecjalizowane projekty. Guava co prawda posiada jeszcze par\u0119 unikalnych trik\u00f3w, takich jak <code>Multimap<\/code> i unikalne implementacje innych kolekcji czy struktur grafowych, a struktury pomocnicze do obs\u0142ugi strumieni. To i inne dodatki sprawiaj\u0105, \u017ce w dalszym ci\u0105gu jest ona wa\u017cnym graczem w ekosystemie, po prostu ju\u017c nie tak &#8222;domy\u015blnym&#8221;, jak by\u0142o to na poziomie JDK 1.7. Projekt jest te\u017c wci\u0105\u017c rozwijany, a niedawno doczeka\u0142 si\u0119 <a href=\"https:\/\/github.com\/google\/guava\/releases\/tag\/v32.0.0\">wersji Guava 32.0<\/a><\/p>\n\n\n\n<p>Ta za\u015b oznacza wielkie sprz\u0105tanie &#8211; adnotacja <code>@Beta<\/code> zosta\u0142a usuni\u0119ta z niemal wszystkich klas, w praktyce oznaczaj\u0105c du\u017c\u0105 stabilizacj\u0119 wielu API. Celem adnotacji <code>@Beta<\/code> by\u0142o umo\u017cliwienie u\u017cytkownikom przekazania opinii przed ca\u0142kowitym ustabilizowaniem API, teraz tw\u00f3rcy postanowili troch\u0119 posprz\u0105ta\u0107 projekt. Dlatego te\u017c nowe wydanie Guava traktowa\u0107 warto jako inwentaryzacj\u0119 u\u0142atwiaj\u0105c\u0105 prac\u0119 na przysz\u0142o\u015b\u0107 i nie wprowadza jakich\u015b du\u017cych zmian. Postanowi\u0142em jednak o niej wspomnie\u0107, gdy\u017c osoby kt\u00f3re ba\u0142y si\u0119 niestabilnych API b\u0119d\u0105 z czystym sumieniem mog\u0142y u\u017cywa\u0107 sporego zbioru ustabilizowanych metod. Warto te\u017c wspomnie\u0107, \u017ce tw\u00f3rcom uda\u0142o si\u0119 zamkn\u0105\u0107 <a href=\"https:\/\/github.com\/advisories\/GHSA-5mg8-w23w-74h3\">pewn\u0105 wisz\u0105c\u0105 podatno\u015b\u0107<\/a>, niestety kosztem pewnych problem\u00f3w z obs\u0142ug\u0105 plik\u00f3w na Windowsie i je\u015bli u\u017cywamy tego systemu, powinni\u015bmy przeskoczy\u0107 od razu do wersji <a href=\"https:\/\/github.com\/google\/guava\/releases\/tag\/v32.0.1\">32.0.1<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Scala 3.3.0<\/h3>\n\n\n\n<p>Uwaga: Scala przesz\u0142a znacz\u0105ce zmiany w swoim cyklu wydawniczym.<\/p>\n\n\n\n<p><a href=\"https:\/\/scala-lang.org\/blog\/2023\/05\/30\/scala-3.3.0-released.html\">Scala 3.3.x<\/a> to pierwsza seria wyda\u0144 Long Term Support (LTS), kt\u00f3r\u0105 aktywnie b\u0119dzie utrzymywano przez co najmniej trzy lata. Analogicznie do modelu wydawniczego Javy, Scala b\u0119dzie posiada\u0142a mniejsze wydania (3.4, 3.5, itd.), zwane <strong>Scala Next<\/strong>. Poprawki b\u0142\u0119d\u00f3w i usprawnienia z tych wyda\u0144 b\u0119d\u0105 przenoszone z powrotem i wydawane jako poprawki 3.3.x, jednak LTS nie b\u0119dzie zawiera\u0142o zmian w API. Rozwi\u0105zanie to ma na celu zwi\u0119kszenie wygody dla tw\u00f3rc\u00f3w bibliotek, kt\u00f3rzy b\u0119d\u0105 otrzymywa\u0107 regularne poprawki b\u0142\u0119d\u00f3w bez konieczno\u015bci wymuszania na u\u017cytkownikach aktualizacji wersji kompilatora.<\/p>\n\n\n\n<p>Sama Scala 3.3.0 wprowadza ponownie linting do kompilatora Scala, co umo\u017cliwia wykrywanie nieu\u017cywanych symboli i warto\u015bci, z zapowiedzi\u0105 dodatkowych opcji w przysz\u0142o\u015bci. Wprowadzono r\u00f3wnie\u017c bardziej sp\u00f3jn\u0105 sk\u0142adni\u0119 bez nawias\u00f3w klamrowych. Pozwala to zast\u0105pi\u0107 nawiasy wok\u00f3\u0142 parametr\u00f3w metod dwukropkiem, co prowadzi do czystszej, kr\u00f3tszej i cz\u0119sto bardziej czytelnego syntanu.<\/p>\n\n\n\n<p>Dodano r\u00f3wnie\u017c dwie nowe metody do standardowej biblioteki, <code>boundary<\/code> i <code>break<\/code>, kt\u00f3re umo\u017cliwiaj\u0105 bezpieczniejsze i bardziej wyraziste zwracanie warto\u015bci z blok\u00f3w. Pozwala to wskaza\u0107, \u017ce wyj\u015bcie z funkcji mo\u017ce nast\u0105pi\u0107 r\u00f3wnie\u017c w ramach jednej z lambd, co tw\u00f3rcy nazywaj\u0105 &#8222;szybk\u0105 ucieczk\u0105&#8221;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def sumOfRoots(numbers: List&#091;Double]): Option&#091;Double] = boundary:\n  val roots = numbers.map: n =&gt;\n    println(s&quot; * calculating square root for $n*&quot;)\n    if n &gt;= 0 then Math.sqrt(n) else break(None)\n  Some(roots.sum)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/in.relation.to\/2023\/06\/02\/hibernate-reactive-2_0_0_Final\">Hibernate Reactive 2.0<\/a><\/h3>\n\n\n\n<p>Na koniec chcia\u0142bym wspomnie\u0107 o premierze Hibernate Reactive 2.0. Na pierwszy rzut oka, wydaje si\u0119 by\u0107 to dosy\u0107 skromne wydanie &#8211; w dzienniku zmian widzimy jedynie kompatybilno\u015b\u0107 z Hibernate ORM 6.2.4 oraz Vert.x SQL client 4.4. Niemniej jednak, nie dajcie si\u0119 zwie\u015b\u0107 pozorom &#8211; przy bli\u017cszym przyjrzeniu si\u0119, oka\u017ce si\u0119, \u017ce jest to kolosalny skok.<\/p>\n\n\n\n<p>Hibernate Reactive 1.0 by\u0142 bowiem kompatybilny jedynie z lini\u0105 Hibernate 5.x. Zmiany wprowadzone przez Hibernate 6.0, wydany oko\u0142o rok temu, a nast\u0119pnie rozwijane w kolejnych wydaniach, s\u0105 na tyle znacz\u0105ce, \u017ce tw\u00f3rcy zach\u0119caj\u0105 do zapoznania si\u0119 z <a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.2\/migration-guide\/migration-guide.html\">poradnikiem migracji<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W dniu dzisiejszym g\u0142\u00f3wnym tematem jest &#8222;zamro\u017cenie&#8221; listy JEP\u00f3w w JDK 21. Opr\u00f3cz tego jednak porozmawiamy te\u017c o Nullach w Valhalli. Na koniec za\u015b obowi\u0105zkowy Release Radar.<\/p>\n","protected":false},"author":10,"featured_media":16198,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-16188","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"10","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-4.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kompaktowe om\u00f3wienie &quot;zamro\u017conej&quot; listy funkcjonalno\u015bci JDK 21 - JVM Weekly vol. 138 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kompaktowe om\u00f3wienie &quot;zamro\u017conej&quot; listy funkcjonalno\u015bci JDK 21 - JVM Weekly vol. 138 - Vived\" \/>\n<meta property=\"og:description\" content=\"W dniu dzisiejszym g\u0142\u00f3wnym tematem jest &quot;zamro\u017cenie&quot; listy JEP\u00f3w w JDK 21. Opr\u00f3cz tego jednak porozmawiamy te\u017c o Nullach w Valhalli. Na koniec za\u015b obowi\u0105zkowy Release Radar.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-09T09:55:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-09T09:55:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Kompaktowe om\u00f3wienie &#8222;zamro\u017conej&#8221; listy funkcjonalno\u015bci JDK 21 &#8211; JVM Weekly vol. 138\",\"datePublished\":\"2023-06-09T09:55:42+00:00\",\"dateModified\":\"2023-06-09T09:55:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\"},\"wordCount\":1828,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\",\"url\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\",\"name\":\"Kompaktowe om\u00f3wienie \\\"zamro\u017conej\\\" listy funkcjonalno\u015bci JDK 21 - JVM Weekly vol. 138 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png\",\"datePublished\":\"2023-06-09T09:55:42+00:00\",\"dateModified\":\"2023-06-09T09:55:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kompaktowe om\u00f3wienie &#8222;zamro\u017conej&#8221; listy funkcjonalno\u015bci JDK 21 &#8211; JVM Weekly vol. 138\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kompaktowe om\u00f3wienie \"zamro\u017conej\" listy funkcjonalno\u015bci JDK 21 - JVM Weekly vol. 138 - Vived","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:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/","og_locale":"pl_PL","og_type":"article","og_title":"Kompaktowe om\u00f3wienie \"zamro\u017conej\" listy funkcjonalno\u015bci JDK 21 - JVM Weekly vol. 138 - Vived","og_description":"W dniu dzisiejszym g\u0142\u00f3wnym tematem jest \"zamro\u017cenie\" listy JEP\u00f3w w JDK 21. Opr\u00f3cz tego jednak porozmawiamy te\u017c o Nullach w Valhalli. Na koniec za\u015b obowi\u0105zkowy Release Radar.","og_url":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/","og_site_name":"Vived","article_published_time":"2023-06-09T09:55:42+00:00","article_modified_time":"2023-06-09T09:55:46+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Kompaktowe om\u00f3wienie &#8222;zamro\u017conej&#8221; listy funkcjonalno\u015bci JDK 21 &#8211; JVM Weekly vol. 138","datePublished":"2023-06-09T09:55:42+00:00","dateModified":"2023-06-09T09:55:46+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/"},"wordCount":1828,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/","url":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/","name":"Kompaktowe om\u00f3wienie \"zamro\u017conej\" listy funkcjonalno\u015bci JDK 21 - JVM Weekly vol. 138 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png","datePublished":"2023-06-09T09:55:42+00:00","dateModified":"2023-06-09T09:55:46+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/JVM-Weekly-1200x628_V2-3.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/kompaktowe-omowienie-zamrozonej-listy-funkcjonalnosci-jdk-21-jvm-weekly-vol-138\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Kompaktowe om\u00f3wienie &#8222;zamro\u017conej&#8221; listy funkcjonalno\u015bci JDK 21 &#8211; JVM Weekly vol. 138"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">1. \"Zamro\u017cona\" lista funkcjonalno\u015bci JDK 21<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. \"Zamro\u017cona\" lista funkcjonalno\u015bci JDK 21<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zacznijmy od najwi\u0119kszego og\u0142oszenia.<\/p>\n","innerContent":["\n<p>Zacznijmy od najwi\u0119kszego og\u0142oszenia.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/openjdk.org\/projects\/jdk\/21\/\">JDK 21 przesz\u0142o do fazy Rampdown<\/a>. W teorii, etap ten powinien oznacza\u0107 zako\u0144czenie wprowadzania zmian, ale wi\u0119cej na ten temat ujawni\u0119 p\u00f3\u017aniej. Cho\u0107 zdawa\u0142em sobie spraw\u0119 z ogromu OpenJDK 21, finalna lista JEP-\u00f3w dalej wywo\u0142uje moim zdaniem mnie wra\u017cenie.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/openjdk.org\/projects\/jdk\/21\/\">JDK 21 przesz\u0142o do fazy Rampdown<\/a>. W teorii, etap ten powinien oznacza\u0107 zako\u0144czenie wprowadzania zmian, ale wi\u0119cej na ten temat ujawni\u0119 p\u00f3\u017aniej. Cho\u0107 zdawa\u0142em sobie spraw\u0119 z ogromu OpenJDK 21, finalna lista JEP-\u00f3w dalej wywo\u0142uje moim zdaniem mnie wra\u017cenie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Z uwagi na liczb\u0119 nowych funkcji, nie mog\u0119 zag\u0142\u0119bia\u0107 si\u0119 w ka\u017cd\u0105 z nich. Postanowi\u0142em wi\u0119c przeprowadzi\u0107 ma\u0142y eksperyment - zamierzam przedstawi\u0107 ka\u017cd\u0105 funkcj\u0119 w jednym zdaniu oraz poprzez fragment kodu (dla stabilnych funkcjonalno\u015bci).<\/p>\n","innerContent":["\n<p>Z uwagi na liczb\u0119 nowych funkcji, nie mog\u0119 zag\u0142\u0119bia\u0107 si\u0119 w ka\u017cd\u0105 z nich. Postanowi\u0142em wi\u0119c przeprowadzi\u0107 ma\u0142y eksperyment - zamierzam przedstawi\u0107 ka\u017cd\u0105 funkcj\u0119 w jednym zdaniu oraz poprzez fragment kodu (dla stabilnych funkcjonalno\u015bci).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlatego bez zb\u0119dnego przed\u0142u\u017cania, zaczynamy, bo i tak du\u017co przed nami:<\/p>\n","innerContent":["\n<p>Dlatego bez zb\u0119dnego przed\u0142u\u017cania, zaczynamy, bo i tak du\u017co przed nami:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Stabilne<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Stabilne<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/431\">431: Sequenced Collections<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/431\">431: Sequenced Collections<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W wypadku uporz\u0105dkowanych kolekcji, wprowadzono sp\u00f3jny interfejs do pobierania pierwszego i ostatniego elementu, a tak\u017ce odwracania sekwencji.<\/p>\n","innerContent":["\n<p>W wypadku uporz\u0105dkowanych kolekcji, wprowadzono sp\u00f3jny interfejs do pobierania pierwszego i ostatniego elementu, a tak\u017ce odwracania sekwencji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>interface SequencedCollection&lt;E&gt; extends Collection&lt;E&gt; {\n    \/\/ new method\n    SequencedCollection&lt;E&gt; reversed();\n    \/\/ methods promoted from Deque\n    void addFirst(E);\n    void addLast(E);\n    E getFirst();\n    E getLast();\n    E removeFirst();\n    E removeLast();\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>interface SequencedCollection&lt;E&gt; extends Collection&lt;E&gt; {\n    \/\/ new method\n    SequencedCollection&lt;E&gt; reversed();\n    \/\/ methods promoted from Deque\n    void addFirst(E);\n    void addLast(E);\n    E getFirst();\n    E getLast();\n    E removeFirst();\n    E removeLast();\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/439\">439: Generational ZGC<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/439\">439: Generational ZGC<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jako, \u017ce <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/gctuning\/garbage-collector-implementation.html#GUID-71D796B3-CBAB-4D80-B5C3-2620E45F6E5D\">prawdopodobie\u0144stwo konieczno\u015bci \"sprz\u0105tania\" przez GC jest zmniejsza si\u0119 wraz z czasem \u017cycia danego obiektu<\/a>, posiadanie innego pipeline dla kr\u00f3tko i d\u0142ugo \u017cyj\u0105cych obiekt\u00f3w jest standardem w GC, a teraz trafia te\u017c ZGC.<\/p>\n","innerContent":["\n<p>Jako, \u017ce <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/gctuning\/garbage-collector-implementation.html#GUID-71D796B3-CBAB-4D80-B5C3-2620E45F6E5D\">prawdopodobie\u0144stwo konieczno\u015bci \"sprz\u0105tania\" przez GC jest zmniejsza si\u0119 wraz z czasem \u017cycia danego obiektu<\/a>, posiadanie innego pipeline dla kr\u00f3tko i d\u0142ugo \u017cyj\u0105cych obiekt\u00f3w jest standardem w GC, a teraz trafia te\u017c ZGC.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/440\">440: Record Patterns<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/440\">440: Record Patterns<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mo\u017cliwo\u015b\u0107 \u0142atwej destrukturyzacji Rekord\u00f3w, umo\u017cliwiaj\u0105ca wyci\u0105gni\u0119cie z nich konkretnych p\u00f3l, a tak\u017ce u\u017cywanie w pattern matchingu (kolejny JEP).<\/p>\n","innerContent":["\n<p>Mo\u017cliwo\u015b\u0107 \u0142atwej destrukturyzacji Rekord\u00f3w, umo\u017cliwiaj\u0105ca wyci\u0105gni\u0119cie z nich konkretnych p\u00f3l, a tak\u017ce u\u017cywanie w pattern matchingu (kolejny JEP).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>if (obj instanceof Point(int x, int y)) {\n    System.out.println(x+y);\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>if (obj instanceof Point(int x, int y)) {\n    System.out.println(x+y);\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/441\">441: Pattern Matching for switch<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/441\">441: Pattern Matching for switch<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mo\u017cliwo\u015b\u0107 u\u017cycia <code>switch<\/code> do pattern matchingu, z uwzgl\u0119dnieniem zaawansowanych opcji.<\/p>\n","innerContent":["\n<p>Mo\u017cliwo\u015b\u0107 u\u017cycia <code>switch<\/code> do pattern matchingu, z uwzgl\u0119dnieniem zaawansowanych opcji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>static String formatterPatternSwitch(Object obj) {\n    return switch (obj) {\n        case Integer i -&gt; String.format(\"int %d\", i);\n        case Long l    -&gt; String.format(\"long %d\", l);\n        case Double d  -&gt; String.format(\"double %f\", d);\n        case String s  -&gt; String.format(\"String %s\", s);\n        default        -&gt; obj.toString();\n    };\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>static String formatterPatternSwitch(Object obj) {\n    return switch (obj) {\n        case Integer i -&gt; String.format(\"int %d\", i);\n        case Long l    -&gt; String.format(\"long %d\", l);\n        case Double d  -&gt; String.format(\"double %f\", d);\n        case String s  -&gt; String.format(\"String %s\", s);\n        default        -&gt; obj.toString();\n    };\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/444\">444: Virtual Threads<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/444\">444: Virtual Threads<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadzenie do JVM konceptu w\u0105tk\u00f3w zarz\u0105dzanych nie przez system operacyjny, a przez sam\u0105 maszyn\u0119 wirtualn\u0105.<\/p>\n","innerContent":["\n<p>Wprowadzenie do JVM konceptu w\u0105tk\u00f3w zarz\u0105dzanych nie przez system operacyjny, a przez sam\u0105 maszyn\u0119 wirtualn\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>Thread.builder().virtual().factory();\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Thread.builder().virtual().factory();\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/449\">449: Deprecate the Windows 32-bit x86 Port for Removal<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/449\">449: Deprecate the Windows 32-bit x86 Port for Removal<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Goodnight, Sweet Prince<\/p>\n","innerContent":["\n<p>Goodnight, Sweet Prince<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/451\">451: Prepare to Disallow the Dynamic Loading of Agents<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/451\">451: Prepare to Disallow the Dynamic Loading of Agents<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W celu zwi\u0119kszenia bezpiecze\u0144stwa Javy, tw\u00f3rcy planuj\u0105 w przysz\u0142o\u015bci zabroni\u0107 \u0142adowania pewnych kategorii Agent\u00f3w Maszyny Wirtualnej bez podania specjalnej flagi.<\/p>\n","innerContent":["\n<p>W celu zwi\u0119kszenia bezpiecze\u0144stwa Javy, tw\u00f3rcy planuj\u0105 w przysz\u0142o\u015bci zabroni\u0107 \u0142adowania pewnych kategorii Agent\u00f3w Maszyny Wirtualnej bez podania specjalnej flagi.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/452\">452: Key Encapsulation Mechanism API<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/452\">452: Key Encapsulation Mechanism API<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadzenie do Javy standardowego API pozwalaj\u0105cego na u\u017cycie techniki znanej jako KEM, wykorzystywanej min. w algorytmach kryptografii kwantowej.<\/p>\n","innerContent":["\n<p>Wprowadzenie do Javy standardowego API pozwalaj\u0105cego na u\u017cycie techniki znanej jako KEM, wykorzystywanej min. w algorytmach kryptografii kwantowej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Preview<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Preview<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/430\">430: String Templates (Preview)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/430\">430: String Templates (Preview)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mo\u017cliwo\u015b\u0107 tworzenia w Javie blok\u00f3w tekstu, daj\u0105cych du\u017co wi\u0119ksze mo\u017cliwo\u015bci i bezpiecze\u0144stwo ni\u017c interpolacja string\u00f3w.<\/p>\n","innerContent":["\n<p>Mo\u017cliwo\u015b\u0107 tworzenia w Javie blok\u00f3w tekstu, daj\u0105cych du\u017co wi\u0119ksze mo\u017cliwo\u015bci i bezpiecze\u0144stwo ni\u017c interpolacja string\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>JSONObject doc = JSON_VALIDATE.\"\"\"\n        {\n            \"name\":    \\{name},\n            \"phone\":   \\{phone},\n            \"address\": \\{address}\n        };\n        \"\"\";\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>JSONObject doc = JSON_VALIDATE.\"\"\"\n        {\n            \"name\":    \\{name},\n            \"phone\":   \\{phone},\n            \"address\": \\{address}\n        };\n        \"\"\";\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/445\">445: Unnamed Classes and Instance Main Methods (Preview)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/445\">445: Unnamed Classes and Instance Main Methods (Preview)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zmiana Launch Protocol w Javie, umo\u017cliwiaj\u0105ca pisania mocno uproszczonych klas Java, g\u0142\u00f3wnie na potrzeby edukacji.<\/p>\n","innerContent":["\n<p>Zmiana Launch Protocol w Javie, umo\u017cliwiaj\u0105ca pisania mocno uproszczonych klas Java, g\u0142\u00f3wnie na potrzeby edukacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>void main() {\n    System.out.println(\"Hello, World!\");\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>void main() {\n    System.out.println(\"Hello, World!\");\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/442\">442: Foreign Function &amp; Memory API (Third Preview)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/442\">442: Foreign Function &amp; Memory API (Third Preview)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadzenie typowanej interoperacyjno\u015bci z programami napisanymi w C (a w przysz\u0142o\u015bci te\u017c innych j\u0119zyk\u00f3w kompilowanych), a tak\u017ce natywnej pami\u0119ci systemu operacyjnego.<\/p>\n","innerContent":["\n<p>Wprowadzenie typowanej interoperacyjno\u015bci z programami napisanymi w C (a w przysz\u0142o\u015bci te\u017c innych j\u0119zyk\u00f3w kompilowanych), a tak\u017ce natywnej pami\u0119ci systemu operacyjnego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/443\">443: Unnamed Patterns and Variables (Preview)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/443\">443: Unnamed Patterns and Variables (Preview)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadzenie do j\u0119zyka wildcard <code>_<\/code>, u\u017cywanego wtedy, gdy nie chcemy w pattern matchingu definiowa\u0107 konkretnej oczekiwanej warto\u015bci\/typu, a tak\u017ce jako hint dla linter\u00f3w, gdy wiemy \u017ce zadeklarowana zmienna jest niepotrzebna.<\/p>\n","innerContent":["\n<p>Wprowadzenie do j\u0119zyka wildcard <code>_<\/code>, u\u017cywanego wtedy, gdy nie chcemy w pattern matchingu definiowa\u0107 konkretnej oczekiwanej warto\u015bci\/typu, a tak\u017ce jako hint dla linter\u00f3w, gdy wiemy \u017ce zadeklarowana zmienna jest niepotrzebna.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>if(r instanceof Point(_, int y))\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>if(r instanceof Point(_, int y))\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/453\">453: Structured Concurrency (Preview)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/453\">453: Structured Concurrency (Preview)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zestaw struktur umo\u017cliwiaj\u0105cych zarz\u0105dzanie w\u0105tkami (nie tylko wirtualnymi), a zw\u0142aszcza potencjalnymi b\u0142\u0119dami.<\/p>\n","innerContent":["\n<p>Zestaw struktur umo\u017cliwiaj\u0105cych zarz\u0105dzanie w\u0105tkami (nie tylko wirtualnymi), a zw\u0142aszcza potencjalnymi b\u0142\u0119dami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code> try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n        Supplier&lt;String&gt;  user  = scope.fork(() -&gt; findUser());\n        Supplier&lt;Integer&gt; order = scope.fork(() -&gt;fetchOrder());\n\n        scope.join().throwIfFailed();\n\n        return new Response(user.get(), order.get());\n    }\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code> try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n        Supplier&lt;String&gt;  user  = scope.fork(() -&gt; findUser());\n        Supplier&lt;Integer&gt; order = scope.fork(() -&gt;fetchOrder());\n\n        scope.join().throwIfFailed();\n\n        return new Response(user.get(), order.get());\n    }\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/446\">446: Scoped Values (Preview)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/446\">446: Scoped Values (Preview)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Alternatywa dla ThreadLocala, zaprojektowana g\u0142\u00f3wnie z my\u015bl\u0105 o wirtualnych w\u0105tkach.<\/p>\n","innerContent":["\n<p>Alternatywa dla ThreadLocala, zaprojektowana g\u0142\u00f3wnie z my\u015bl\u0105 o wirtualnych w\u0105tkach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>final static ScopedValue&lt;...&gt; V = ScopedValue.newInstance();\n\nScopedValue.where(V, &lt;value&gt;).run(() -&gt; {  V.get() });\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>final static ScopedValue&lt;...&gt; V = ScopedValue.newInstance();\n\nScopedValue.where(V, &lt;value&gt;).run(() -&gt; {  V.get() });\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Inkubacja<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Inkubacja<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/448\">448: Vector API (Sixth Incubator)<\/a><\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/448\">448: Vector API (Sixth Incubator)<\/a><\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czekaj\u0105ce na Valhalle API umo\u017cliwiaj\u0105ce operacje wektorowe, udost\u0119pniane przez nowoczesne procesory.<\/p>\n","innerContent":["\n<p>Czekaj\u0105ce na Valhalle API umo\u017cliwiaj\u0105ce operacje wektorowe, udost\u0119pniane przez nowoczesne procesory.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec, je\u015bli Wam ma\u0142o, mam dla Was dwa wideo.<\/p>\n","innerContent":["\n<p>A na koniec, je\u015bli Wam ma\u0142o, mam dla Was dwa wideo.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jedno z nich to \u015bwietne opracowanie ze strony kana\u0142u Inside Java, w kt\u00f3rym Nicolai Parlog w 20 minutowym filmiku w szerszym stopniu opisuje ka\u017cdy z JEP-\u00f3w:<\/p>\n","innerContent":["\n<p>Jedno z nich to \u015bwietne opracowanie ze strony kana\u0142u Inside Java, w kt\u00f3rym Nicolai Parlog w 20 minutowym filmiku w szerszym stopniu opisuje ka\u017cdy z JEP-\u00f3w:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=qGaUZ1Z34jw","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=qGaUZ1Z34jw\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=qGaUZ1Z34jw\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Drugie to dla mnie okazja, aby przemyci\u0107 jeden z moich ulubionych kana\u0142\u00f3w programistycznych na YouTube. Je\u015bli cenicie sobie lekk\u0105, \"memiczn\u0105\" formu\u0142\u0119 opracowa\u0144, to <a href=\"https:\/\/www.youtube.com\/channel\/UCsBjURrPoezykLs9EqgamOA\">Fireship<\/a> zdecydowanie powinien przypa\u015b\u0107 Wam do gustu. Zawarto\u015b\u0107 tego kana\u0142u to przede wszystkim kr\u00f3tkie, poni\u017cej pi\u0119ciominutowe filmy.<\/p>\n","innerContent":["\n<p>Drugie to dla mnie okazja, aby przemyci\u0107 jeden z moich ulubionych kana\u0142\u00f3w programistycznych na YouTube. Je\u015bli cenicie sobie lekk\u0105, \"memiczn\u0105\" formu\u0142\u0119 opracowa\u0144, to <a href=\"https:\/\/www.youtube.com\/channel\/UCsBjURrPoezykLs9EqgamOA\">Fireship<\/a> zdecydowanie powinien przypa\u015b\u0107 Wam do gustu. Zawarto\u015b\u0107 tego kana\u0142u to przede wszystkim kr\u00f3tkie, poni\u017cej pi\u0119ciominutowe filmy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Autor skupia si\u0119 na najistotniejszych tematach ze \u015bwiata programowania. Dla mnie zawsze jest to fantastyczny spos\u00f3b na \u015bledzenie nowo\u015bci z obszar\u00f3w poza moj\u0105 g\u0142\u00f3wn\u0105 specjalizacj\u0105, jak na przyk\u0142ad nowe j\u0119zyki programowania czy innowacje typu bazy wektorowe.<\/p>\n","innerContent":["\n<p>Autor skupia si\u0119 na najistotniejszych tematach ze \u015bwiata programowania. Dla mnie zawsze jest to fantastyczny spos\u00f3b na \u015bledzenie nowo\u015bci z obszar\u00f3w poza moj\u0105 g\u0142\u00f3wn\u0105 specjalizacj\u0105, jak na przyk\u0142ad nowe j\u0119zyki programowania czy innowacje typu bazy wektorowe.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Podkre\u015blam to, poniewa\u017c niedawno na kanale Fireship ukaza\u0142o si\u0119 video po\u015bwi\u0119cone JDK 21. Zach\u0119cam do sprawdzenia, czy taki format odpowiada te\u017c&nbsp;Wam. Moim zdaniem, warto da\u0107 mu szans\u0119:<\/p>\n","innerContent":["\n<p>Podkre\u015blam to, poniewa\u017c niedawno na kanale Fireship ukaza\u0142o si\u0119 video po\u015bwi\u0119cone JDK 21. Zach\u0119cam do sprawdzenia, czy taki format odpowiada te\u017c&nbsp;Wam. Moim zdaniem, warto da\u0107 mu szans\u0119:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=Ibjm2KHfymo","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=Ibjm2KHfymo\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=Ibjm2KHfymo\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS: Nie wiem czy pami\u0119tacie, ale z tym \"\u017cadnych zmian\" to r\u00f3\u017cnie bywa\u0142o w przesz\u0142o\u015bci. Przy okazji JDK 20 tw\u00f3rcy zapomnieli bowiem wrzuci\u0107 do inkubacji Vector API, kt\u00f3re zosta\u0142o dodane w zasadzie zaraz przed premier\u0105 wydania.<\/p>\n","innerContent":["\n<p>PS: Nie wiem czy pami\u0119tacie, ale z tym \"\u017cadnych zmian\" to r\u00f3\u017cnie bywa\u0142o w przesz\u0142o\u015bci. Przy okazji JDK 20 tw\u00f3rcy zapomnieli bowiem wrzuci\u0107 do inkubacji Vector API, kt\u00f3re zosta\u0142o dodane w zasadzie zaraz przed premier\u0105 wydania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/gallery","attrs":{"linkTo":"none"},"innerBlocks":[{"blockName":"core\/image","attrs":{"id":16192,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/ezgif-3-9da847db29-1.gif\" alt=\"\" class=\"wp-image-16192\"\/><figcaption class=\"wp-element-caption\">Wizualizacja<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/ezgif-3-9da847db29-1.gif\" alt=\"\" class=\"wp-image-16192\"\/><figcaption class=\"wp-element-caption\">Wizualizacja<\/figcaption><\/figure>\n"]}],"innerHTML":"\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped\"><\/figure>\n","innerContent":["\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped\">",null,"<\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS2: Je\u015bli chodzi o Structured Concurrency, to za kulisami dzia\u0142o si\u0119 mas\u0119 ciekawych rzeczy i dyskusji, kt\u00f3re my\u015bla\u0142em opisa\u0107 w\u0142a\u015bnie przy okazji oficjalnego opublikowania listy JEP-\u00f3w. Jak ju\u017c wspomnia\u0142em, to okazuje si\u0119 by\u0107 jednak na tyle mocarne, \u017ce temat zostawimy sobie na p\u00f3\u017aniej.<\/p>\n","innerContent":["\n<p>PS2: Je\u015bli chodzi o Structured Concurrency, to za kulisami dzia\u0142o si\u0119 mas\u0119 ciekawych rzeczy i dyskusji, kt\u00f3re my\u015bla\u0142em opisa\u0107 w\u0142a\u015bnie przy okazji oficjalnego opublikowania listy JEP-\u00f3w. Jak ju\u017c wspomnia\u0142em, to okazuje si\u0119 by\u0107 jednak na tyle mocarne, \u017ce temat zostawimy sobie na p\u00f3\u017aniej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Valhalla ju\u017c oficjalnie zamiesza w podej\u015bciu do Nullowalno\u015bci w Javie<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Valhalla ju\u017c oficjalnie zamiesza w podej\u015bciu do Nullowalno\u015bci w Javie<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dla dynamiki, zmieniamy teraz tempo i zamiast skr\u00f3towo om\u00f3wi\u0107 nadchodz\u0105c\u0105 wersj\u0119, kt\u00f3rej premiera planowana jest na jesie\u0144, porozmawiamy szerzej o tym, co zosta\u0142o zapowiedziane w kontek\u015bcie Valhalli. Data premiery nie jest jeszcze znana, ale kolejne dokumenty sugeruj\u0105, \u017ce zbli\u017camy si\u0119 do finalnego wydania. Brian Goetz podzieli\u0142 si\u0119 <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Design document on nullability and value types<\/a>, kt\u00f3ry podsumowuje nowy etap rozwoju projektu. Zn\u00f3w mo\u017cemy spojrze\u0107 na wyzwania, ale tak\u017ce na nowe mo\u017cliwo\u015bci, kt\u00f3re si\u0119 pojawiaj\u0105. Valhalla wydaje si\u0119 by\u0107 projektem rozwijanym w spos\u00f3b mocno empiryczny.<\/p>\n","innerContent":["\n<p>Dla dynamiki, zmieniamy teraz tempo i zamiast skr\u00f3towo om\u00f3wi\u0107 nadchodz\u0105c\u0105 wersj\u0119, kt\u00f3rej premiera planowana jest na jesie\u0144, porozmawiamy szerzej o tym, co zosta\u0142o zapowiedziane w kontek\u015bcie Valhalli. Data premiery nie jest jeszcze znana, ale kolejne dokumenty sugeruj\u0105, \u017ce zbli\u017camy si\u0119 do finalnego wydania. Brian Goetz podzieli\u0142 si\u0119 <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Design document on nullability and value types<\/a>, kt\u00f3ry podsumowuje nowy etap rozwoju projektu. Zn\u00f3w mo\u017cemy spojrze\u0107 na wyzwania, ale tak\u017ce na nowe mo\u017cliwo\u015bci, kt\u00f3re si\u0119 pojawiaj\u0105. Valhalla wydaje si\u0119 by\u0107 projektem rozwijanym w spos\u00f3b mocno empiryczny.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16194,"width":463,"height":512,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7-925x1024.png\" alt=\"\" class=\"wp-image-16194\" width=\"463\" height=\"512\"\/><figcaption class=\"wp-element-caption\">Jest wiele do nauczenia si\u0119 od Javy, je\u017celi chodzi o prawdziwie iteracyjny rozw\u00f3j projektu.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-7-925x1024.png\" alt=\"\" class=\"wp-image-16194\" width=\"463\" height=\"512\"\/><figcaption class=\"wp-element-caption\">Jest wiele do nauczenia si\u0119 od Javy, je\u017celi chodzi o prawdziwie iteracyjny rozw\u00f3j projektu.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli nie \u015bledzicie na bie\u017c\u0105co rozwoju Valhalli, mo\u017cliwe, \u017ce umkn\u0105\u0142 Wam fakt, \u017ce w pewnym momencie tw\u00f3rcy zaproponowali sufiksy <code>.val<\/code> i <code>.ref<\/code>. Mia\u0142y one informowa\u0107, czy chcemy u\u017cywa\u0107 danego obiektu jako warto\u015bci, czy jako referencji. To by\u0142o dla mnie najbardziej problematyczne spo\u015br\u00f3d proponowanych zmian, obawia\u0142em si\u0119 bowiem komplikacji sk\u0142adni. Na razie wygl\u0105da na to, \u017ce uda si\u0119 z nich zrezygnowa\u0107. Prace nad rozwojem ca\u0142ego projektu pozwoli\u0142y zredukowa\u0107 r\u00f3\u017cnice mi\u0119dzy typami prymitywnymi a obiektami do dw\u00f3ch fundamentalnych r\u00f3\u017cnic - posiadania warto\u015bci domy\u015blnej (jak 0 w przypadku int) oraz wsparcia dla nullowalno\u015bci. W kolejnej iteracji prac nad Valhall\u0105, pierwsze z nich zosta\u0142o zaadresowane poprzez koncepcj\u0119 <code>implicit constructors<\/code> dla Value Class.<\/p>\n","innerContent":["\n<p>Je\u015bli nie \u015bledzicie na bie\u017c\u0105co rozwoju Valhalli, mo\u017cliwe, \u017ce umkn\u0105\u0142 Wam fakt, \u017ce w pewnym momencie tw\u00f3rcy zaproponowali sufiksy <code>.val<\/code> i <code>.ref<\/code>. Mia\u0142y one informowa\u0107, czy chcemy u\u017cywa\u0107 danego obiektu jako warto\u015bci, czy jako referencji. To by\u0142o dla mnie najbardziej problematyczne spo\u015br\u00f3d proponowanych zmian, obawia\u0142em si\u0119 bowiem komplikacji sk\u0142adni. Na razie wygl\u0105da na to, \u017ce uda si\u0119 z nich zrezygnowa\u0107. Prace nad rozwojem ca\u0142ego projektu pozwoli\u0142y zredukowa\u0107 r\u00f3\u017cnice mi\u0119dzy typami prymitywnymi a obiektami do dw\u00f3ch fundamentalnych r\u00f3\u017cnic - posiadania warto\u015bci domy\u015blnej (jak 0 w przypadku int) oraz wsparcia dla nullowalno\u015bci. W kolejnej iteracji prac nad Valhall\u0105, pierwsze z nich zosta\u0142o zaadresowane poprzez koncepcj\u0119 <code>implicit constructors<\/code> dla Value Class.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>value class Complex {\n     private int re;\n     private int im;\n\n     public implicit Complex();\n     public Complex(int re, int im) { ... }\n\n     ...\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>value class Complex {\n     private int re;\n     private int im;\n\n     public implicit Complex();\n     public Complex(int re, int im) { ... }\n\n     ...\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co do nullowalno\u015bci, pojawi\u0142a si\u0119 propozycja wprowadzenia dw\u00f3ch dodatkowych oznacze\u0144 przy definiowaniu typu - <code>!<\/code> oznaczaj\u0105cy <em>nie dopuszczamy nulla<\/em> oraz <code>?<\/code> oznaczaj\u0105cy <em>ten obiekt jest nullowalny<\/em>. W skr\u00f3cie:<\/p>\n","innerContent":["\n<p>Co do nullowalno\u015bci, pojawi\u0142a si\u0119 propozycja wprowadzenia dw\u00f3ch dodatkowych oznacze\u0144 przy definiowaniu typu - <code>!<\/code> oznaczaj\u0105cy <em>nie dopuszczamy nulla<\/em> oraz <code>?<\/code> oznaczaj\u0105cy <em>ten obiekt jest nullowalny<\/em>. W skr\u00f3cie:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><code>Foo?<\/code> oznacza <em>ten typ zawiera w swoim zbiorze warto\u015bci null<\/em><\/li>\n","innerContent":["\n<li><code>Foo?<\/code> oznacza <em>ten typ zawiera w swoim zbiorze warto\u015bci null<\/em><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><code>Foo!<\/code> oznacza <em>ten typ nie zawiera w swoim zbiorze warto\u015bci null<\/em><\/li>\n","innerContent":["\n<li><code>Foo!<\/code> oznacza <em>ten typ nie zawiera w swoim zbiorze warto\u015bci null<\/em><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><code>Foo<\/code> oznacza \ud83e\udd37\u200d\u2642\ufe0f - inaczej m\u00f3wi\u0105c, nie okre\u015blony stan nullowalno\u015bci<\/li>\n","innerContent":["\n<li><code>Foo<\/code> oznacza \ud83e\udd37\u200d\u2642\ufe0f - inaczej m\u00f3wi\u0105c, nie okre\u015blony stan nullowalno\u015bci<\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Z czasem, tw\u00f3rcy b\u0119d\u0105 d\u0105\u017cy\u0107 do tego, aby wersja bez odpowiedniej adnotacji przyjmowa\u0142a cechy wariant\u00f3w anotowanych - na ten moment wydaje si\u0119, \u017ce nieoznaczone <code>Foo<\/code> b\u0119dzie w wi\u0119kszo\u015bci przypadk\u00f3w traktowane jako nienulowalne.<\/p>\n","innerContent":["\n<p>Z czasem, tw\u00f3rcy b\u0119d\u0105 d\u0105\u017cy\u0107 do tego, aby wersja bez odpowiedniej adnotacji przyjmowa\u0142a cechy wariant\u00f3w anotowanych - na ten moment wydaje si\u0119, \u017ce nieoznaczone <code>Foo<\/code> b\u0119dzie w wi\u0119kszo\u015bci przypadk\u00f3w traktowane jako nienulowalne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Niestety, weryfikacja powy\u017cszych b\u0119dzie wymaga\u0142a mieszaniny sprawdze\u0144 na poziomie czasu kompilacji i czasu wykonania, b\u0119dzie te\u017c bardzo trudna i na pocz\u0105tku ograniczona - dodawanie nowych funkcji do istniej\u0105cego j\u0119zyka nigdy nie jest proste, a szczeg\u00f3\u0142owe rozwi\u0105zania zaproponowane przez Briana pokazuj\u0105, jak wiele przypadk\u00f3w trzeba obs\u0142u\u017cy\u0107. Na dow\u00f3d tego, dzie\u0144 po udost\u0119pnieniu <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Design document on nullability and value types<\/a>, na list\u0119 mailingow\u0105 trafi\u0142o <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Briefest summary of today's Valhalla+nullness picture<\/a>, b\u0119d\u0105ce destylatem dokumentu. Mimo \u017ce jest to bardzo dobre podsumowanie, aby naprawd\u0119 zrozumie\u0107 istot\u0119 zmian, musia\u0142em przejrze\u0107 oryginalny tekst. Mapa to jednak nie terytorium.<\/p>\n","innerContent":["\n<p>Niestety, weryfikacja powy\u017cszych b\u0119dzie wymaga\u0142a mieszaniny sprawdze\u0144 na poziomie czasu kompilacji i czasu wykonania, b\u0119dzie te\u017c bardzo trudna i na pocz\u0105tku ograniczona - dodawanie nowych funkcji do istniej\u0105cego j\u0119zyka nigdy nie jest proste, a szczeg\u00f3\u0142owe rozwi\u0105zania zaproponowane przez Briana pokazuj\u0105, jak wiele przypadk\u00f3w trzeba obs\u0142u\u017cy\u0107. Na dow\u00f3d tego, dzie\u0144 po udost\u0119pnieniu <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Design document on nullability and value types<\/a>, na list\u0119 mailingow\u0105 trafi\u0142o <a href=\"https:\/\/mail.openjdk.org\/pipermail\/valhalla-spec-observers\/2023-June\/002253.html\">Briefest summary of today's Valhalla+nullness picture<\/a>, b\u0119d\u0105ce destylatem dokumentu. Mimo \u017ce jest to bardzo dobre podsumowanie, aby naprawd\u0119 zrozumie\u0107 istot\u0119 zmian, musia\u0142em przejrze\u0107 oryginalny tekst. Mapa to jednak nie terytorium.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16196,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-8.png\" alt=\"W dniu dzisiejszym\" class=\"wp-image-16196\"\/><figcaption class=\"wp-element-caption\">Znam swoje miejsce.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image-8.png\" alt=\"W dniu dzisiejszym\" class=\"wp-image-16196\"\/><figcaption class=\"wp-element-caption\">Znam swoje miejsce.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Release Radar<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Release Radar<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Guava 32.0<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Guava 32.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Guava czasy swojej najwi\u0119kszej chwa\u0142y ma ju\u017c chyba za sob\u0105. Wiele z funkcjonalno\u015bci, kt\u00f3re przynosi\u0142a - w swoim czasie rewolucyjnych - zosta\u0142o w\u0142\u0105czonych do JDK albo rozwini\u0119te przez wyspecjalizowane projekty. Guava co prawda posiada jeszcze par\u0119 unikalnych trik\u00f3w, takich jak <code>Multimap<\/code> i unikalne implementacje innych kolekcji czy struktur grafowych, a struktury pomocnicze do obs\u0142ugi strumieni. To i inne dodatki sprawiaj\u0105, \u017ce w dalszym ci\u0105gu jest ona wa\u017cnym graczem w ekosystemie, po prostu ju\u017c nie tak \"domy\u015blnym\", jak by\u0142o to na poziomie JDK 1.7. Projekt jest te\u017c wci\u0105\u017c rozwijany, a niedawno doczeka\u0142 si\u0119 <a href=\"https:\/\/github.com\/google\/guava\/releases\/tag\/v32.0.0\">wersji Guava 32.0<\/a><\/p>\n","innerContent":["\n<p>Guava czasy swojej najwi\u0119kszej chwa\u0142y ma ju\u017c chyba za sob\u0105. Wiele z funkcjonalno\u015bci, kt\u00f3re przynosi\u0142a - w swoim czasie rewolucyjnych - zosta\u0142o w\u0142\u0105czonych do JDK albo rozwini\u0119te przez wyspecjalizowane projekty. Guava co prawda posiada jeszcze par\u0119 unikalnych trik\u00f3w, takich jak <code>Multimap<\/code> i unikalne implementacje innych kolekcji czy struktur grafowych, a struktury pomocnicze do obs\u0142ugi strumieni. To i inne dodatki sprawiaj\u0105, \u017ce w dalszym ci\u0105gu jest ona wa\u017cnym graczem w ekosystemie, po prostu ju\u017c nie tak \"domy\u015blnym\", jak by\u0142o to na poziomie JDK 1.7. Projekt jest te\u017c wci\u0105\u017c rozwijany, a niedawno doczeka\u0142 si\u0119 <a href=\"https:\/\/github.com\/google\/guava\/releases\/tag\/v32.0.0\">wersji Guava 32.0<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ta za\u015b oznacza wielkie sprz\u0105tanie - adnotacja <code>@Beta<\/code> zosta\u0142a usuni\u0119ta z niemal wszystkich klas, w praktyce oznaczaj\u0105c du\u017c\u0105 stabilizacj\u0119 wielu API. Celem adnotacji <code>@Beta<\/code> by\u0142o umo\u017cliwienie u\u017cytkownikom przekazania opinii przed ca\u0142kowitym ustabilizowaniem API, teraz tw\u00f3rcy postanowili troch\u0119 posprz\u0105ta\u0107 projekt. Dlatego te\u017c nowe wydanie Guava traktowa\u0107 warto jako inwentaryzacj\u0119 u\u0142atwiaj\u0105c\u0105 prac\u0119 na przysz\u0142o\u015b\u0107 i nie wprowadza jakich\u015b du\u017cych zmian. Postanowi\u0142em jednak o niej wspomnie\u0107, gdy\u017c osoby kt\u00f3re ba\u0142y si\u0119 niestabilnych API b\u0119d\u0105 z czystym sumieniem mog\u0142y u\u017cywa\u0107 sporego zbioru ustabilizowanych metod. Warto te\u017c wspomnie\u0107, \u017ce tw\u00f3rcom uda\u0142o si\u0119 zamkn\u0105\u0107 <a href=\"https:\/\/github.com\/advisories\/GHSA-5mg8-w23w-74h3\">pewn\u0105 wisz\u0105c\u0105 podatno\u015b\u0107<\/a>, niestety kosztem pewnych problem\u00f3w z obs\u0142ug\u0105 plik\u00f3w na Windowsie i je\u015bli u\u017cywamy tego systemu, powinni\u015bmy przeskoczy\u0107 od razu do wersji <a href=\"https:\/\/github.com\/google\/guava\/releases\/tag\/v32.0.1\">32.0.1<\/a>.<\/p>\n","innerContent":["\n<p>Ta za\u015b oznacza wielkie sprz\u0105tanie - adnotacja <code>@Beta<\/code> zosta\u0142a usuni\u0119ta z niemal wszystkich klas, w praktyce oznaczaj\u0105c du\u017c\u0105 stabilizacj\u0119 wielu API. Celem adnotacji <code>@Beta<\/code> by\u0142o umo\u017cliwienie u\u017cytkownikom przekazania opinii przed ca\u0142kowitym ustabilizowaniem API, teraz tw\u00f3rcy postanowili troch\u0119 posprz\u0105ta\u0107 projekt. Dlatego te\u017c nowe wydanie Guava traktowa\u0107 warto jako inwentaryzacj\u0119 u\u0142atwiaj\u0105c\u0105 prac\u0119 na przysz\u0142o\u015b\u0107 i nie wprowadza jakich\u015b du\u017cych zmian. Postanowi\u0142em jednak o niej wspomnie\u0107, gdy\u017c osoby kt\u00f3re ba\u0142y si\u0119 niestabilnych API b\u0119d\u0105 z czystym sumieniem mog\u0142y u\u017cywa\u0107 sporego zbioru ustabilizowanych metod. Warto te\u017c wspomnie\u0107, \u017ce tw\u00f3rcom uda\u0142o si\u0119 zamkn\u0105\u0107 <a href=\"https:\/\/github.com\/advisories\/GHSA-5mg8-w23w-74h3\">pewn\u0105 wisz\u0105c\u0105 podatno\u015b\u0107<\/a>, niestety kosztem pewnych problem\u00f3w z obs\u0142ug\u0105 plik\u00f3w na Windowsie i je\u015bli u\u017cywamy tego systemu, powinni\u015bmy przeskoczy\u0107 od razu do wersji <a href=\"https:\/\/github.com\/google\/guava\/releases\/tag\/v32.0.1\">32.0.1<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Scala 3.3.0<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Scala 3.3.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Uwaga: Scala przesz\u0142a znacz\u0105ce zmiany w swoim cyklu wydawniczym.<\/p>\n","innerContent":["\n<p>Uwaga: Scala przesz\u0142a znacz\u0105ce zmiany w swoim cyklu wydawniczym.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/scala-lang.org\/blog\/2023\/05\/30\/scala-3.3.0-released.html\">Scala 3.3.x<\/a> to pierwsza seria wyda\u0144 Long Term Support (LTS), kt\u00f3r\u0105 aktywnie b\u0119dzie utrzymywano przez co najmniej trzy lata. Analogicznie do modelu wydawniczego Javy, Scala b\u0119dzie posiada\u0142a mniejsze wydania (3.4, 3.5, itd.), zwane <strong>Scala Next<\/strong>. Poprawki b\u0142\u0119d\u00f3w i usprawnienia z tych wyda\u0144 b\u0119d\u0105 przenoszone z powrotem i wydawane jako poprawki 3.3.x, jednak LTS nie b\u0119dzie zawiera\u0142o zmian w API. Rozwi\u0105zanie to ma na celu zwi\u0119kszenie wygody dla tw\u00f3rc\u00f3w bibliotek, kt\u00f3rzy b\u0119d\u0105 otrzymywa\u0107 regularne poprawki b\u0142\u0119d\u00f3w bez konieczno\u015bci wymuszania na u\u017cytkownikach aktualizacji wersji kompilatora.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/scala-lang.org\/blog\/2023\/05\/30\/scala-3.3.0-released.html\">Scala 3.3.x<\/a> to pierwsza seria wyda\u0144 Long Term Support (LTS), kt\u00f3r\u0105 aktywnie b\u0119dzie utrzymywano przez co najmniej trzy lata. Analogicznie do modelu wydawniczego Javy, Scala b\u0119dzie posiada\u0142a mniejsze wydania (3.4, 3.5, itd.), zwane <strong>Scala Next<\/strong>. Poprawki b\u0142\u0119d\u00f3w i usprawnienia z tych wyda\u0144 b\u0119d\u0105 przenoszone z powrotem i wydawane jako poprawki 3.3.x, jednak LTS nie b\u0119dzie zawiera\u0142o zmian w API. Rozwi\u0105zanie to ma na celu zwi\u0119kszenie wygody dla tw\u00f3rc\u00f3w bibliotek, kt\u00f3rzy b\u0119d\u0105 otrzymywa\u0107 regularne poprawki b\u0142\u0119d\u00f3w bez konieczno\u015bci wymuszania na u\u017cytkownikach aktualizacji wersji kompilatora.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sama Scala 3.3.0 wprowadza ponownie linting do kompilatora Scala, co umo\u017cliwia wykrywanie nieu\u017cywanych symboli i warto\u015bci, z zapowiedzi\u0105 dodatkowych opcji w przysz\u0142o\u015bci. Wprowadzono r\u00f3wnie\u017c bardziej sp\u00f3jn\u0105 sk\u0142adni\u0119 bez nawias\u00f3w klamrowych. Pozwala to zast\u0105pi\u0107 nawiasy wok\u00f3\u0142 parametr\u00f3w metod dwukropkiem, co prowadzi do czystszej, kr\u00f3tszej i cz\u0119sto bardziej czytelnego syntanu.<\/p>\n","innerContent":["\n<p>Sama Scala 3.3.0 wprowadza ponownie linting do kompilatora Scala, co umo\u017cliwia wykrywanie nieu\u017cywanych symboli i warto\u015bci, z zapowiedzi\u0105 dodatkowych opcji w przysz\u0142o\u015bci. Wprowadzono r\u00f3wnie\u017c bardziej sp\u00f3jn\u0105 sk\u0142adni\u0119 bez nawias\u00f3w klamrowych. Pozwala to zast\u0105pi\u0107 nawiasy wok\u00f3\u0142 parametr\u00f3w metod dwukropkiem, co prowadzi do czystszej, kr\u00f3tszej i cz\u0119sto bardziej czytelnego syntanu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dodano r\u00f3wnie\u017c dwie nowe metody do standardowej biblioteki, <code>boundary<\/code> i <code>break<\/code>, kt\u00f3re umo\u017cliwiaj\u0105 bezpieczniejsze i bardziej wyraziste zwracanie warto\u015bci z blok\u00f3w. Pozwala to wskaza\u0107, \u017ce wyj\u015bcie z funkcji mo\u017ce nast\u0105pi\u0107 r\u00f3wnie\u017c w ramach jednej z lambd, co tw\u00f3rcy nazywaj\u0105 \"szybk\u0105 ucieczk\u0105\".<\/p>\n","innerContent":["\n<p>Dodano r\u00f3wnie\u017c dwie nowe metody do standardowej biblioteki, <code>boundary<\/code> i <code>break<\/code>, kt\u00f3re umo\u017cliwiaj\u0105 bezpieczniejsze i bardziej wyraziste zwracanie warto\u015bci z blok\u00f3w. Pozwala to wskaza\u0107, \u017ce wyj\u015bcie z funkcji mo\u017ce nast\u0105pi\u0107 r\u00f3wnie\u017c w ramach jednej z lambd, co tw\u00f3rcy nazywaj\u0105 \"szybk\u0105 ucieczk\u0105\".<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>def sumOfRoots(numbers: List&#91;Double]): Option&#91;Double] = boundary:\n  val roots = numbers.map: n =&gt;\n    println(s\" * calculating square root for $n*\")\n    if n &gt;= 0 then Math.sqrt(n) else break(None)\n  Some(roots.sum)\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>def sumOfRoots(numbers: List&#91;Double]): Option&#91;Double] = boundary:\n  val roots = numbers.map: n =&gt;\n    println(s\" * calculating square root for $n*\")\n    if n &gt;= 0 then Math.sqrt(n) else break(None)\n  Some(roots.sum)\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/in.relation.to\/2023\/06\/02\/hibernate-reactive-2_0_0_Final\">Hibernate Reactive 2.0<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/in.relation.to\/2023\/06\/02\/hibernate-reactive-2_0_0_Final\">Hibernate Reactive 2.0<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na koniec chcia\u0142bym wspomnie\u0107 o premierze Hibernate Reactive 2.0. Na pierwszy rzut oka, wydaje si\u0119 by\u0107 to dosy\u0107 skromne wydanie - w dzienniku zmian widzimy jedynie kompatybilno\u015b\u0107 z Hibernate ORM 6.2.4 oraz Vert.x SQL client 4.4. Niemniej jednak, nie dajcie si\u0119 zwie\u015b\u0107 pozorom - przy bli\u017cszym przyjrzeniu si\u0119, oka\u017ce si\u0119, \u017ce jest to kolosalny skok.<\/p>\n","innerContent":["\n<p>Na koniec chcia\u0142bym wspomnie\u0107 o premierze Hibernate Reactive 2.0. Na pierwszy rzut oka, wydaje si\u0119 by\u0107 to dosy\u0107 skromne wydanie - w dzienniku zmian widzimy jedynie kompatybilno\u015b\u0107 z Hibernate ORM 6.2.4 oraz Vert.x SQL client 4.4. Niemniej jednak, nie dajcie si\u0119 zwie\u015b\u0107 pozorom - przy bli\u017cszym przyjrzeniu si\u0119, oka\u017ce si\u0119, \u017ce jest to kolosalny skok.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Hibernate Reactive 1.0 by\u0142 bowiem kompatybilny jedynie z lini\u0105 Hibernate 5.x. Zmiany wprowadzone przez Hibernate 6.0, wydany oko\u0142o rok temu, a nast\u0119pnie rozwijane w kolejnych wydaniach, s\u0105 na tyle znacz\u0105ce, \u017ce tw\u00f3rcy zach\u0119caj\u0105 do zapoznania si\u0119 z <a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.2\/migration-guide\/migration-guide.html\">poradnikiem migracji<\/a>.<\/p>\n","innerContent":["\n<p>Hibernate Reactive 1.0 by\u0142 bowiem kompatybilny jedynie z lini\u0105 Hibernate 5.x. Zmiany wprowadzone przez Hibernate 6.0, wydany oko\u0142o rok temu, a nast\u0119pnie rozwijane w kolejnych wydaniach, s\u0105 na tyle znacz\u0105ce, \u017ce tw\u00f3rcy zach\u0119caj\u0105 do zapoznania si\u0119 z <a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.2\/migration-guide\/migration-guide.html\">poradnikiem migracji<\/a>.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=16188"}],"version-history":[{"count":3,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16188\/revisions"}],"predecessor-version":[{"id":16203,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16188\/revisions\/16203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16198"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}