{"id":17250,"date":"2023-12-07T12:12:49","date_gmt":"2023-12-07T11:12:49","guid":{"rendered":"https:\/\/vived.io\/?p=17250"},"modified":"2023-12-07T15:34:01","modified_gmt":"2023-12-07T14:34:01","slug":"feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/","title":{"rendered":"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja?  JVM Weekly vol. 156"},"content":{"rendered":"\n<h2 id=\"stable\" data-num=1>Stable<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/423\">JEP 423: Region Pinning for G1<\/a><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-17309\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 423 ma na celu zredukowanie op\u00f3\u017anie\u0144 w G1 poprzez implementacj\u0119 tak zwanego \u201cprzypinania region\u00f3w\u201d, dzi\u0119ki czemu nie ma potrzeby wy\u0142\u0105czania mechanizm\u00f3w Garbage Collection w <em>krytycznych regionach<\/em> Java Native Interface.<\/p>\n\n\n\n<p>Krytyczny region JNI odnosi si\u0119 do specyficznej sekcji kodu, w kt\u00f3rej w\u0105tek Javy uzyskuje bezpo\u015bredni dost\u0119p do obiekt\u00f3w Javy. W tym regionie, w\u0105tek mo\u017ce bezpo\u015brednio manipulowa\u0107 danymi obiektu, co jest kluczowe dla wsp\u00f3\u0142pracy z \u201cniezarz\u0105dzanymi\u201d j\u0119zykami programowania, takimi jak C i C++. Oryginalny JEP do\u015b\u0107 przyst\u0119pnie opisuje ten koncept.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Kiedy w\u0105tek znajduje si\u0119 w krytycznym regionie JNI, JVM musia\u0142 unika\u0107 przesuwania znajduj\u0105cych si\u0119 w nim obiekt\u00f3w podczas procesu od\u015bmiecania. G1 dezaktywuje GC w ka\u017cdym krytycznym regionie, co znacz\u0105co wp\u0142ywa na jego op\u00f3\u017anienia w przypadku kodu JNI.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP rozszerza G1 o mo\u017cliwo\u015b\u0107 <em>przypinania<\/em> dowolnych region\u00f3w. Polega to na utrzymaniu licznika krytycznych obiekt\u00f3w w ka\u017cdym regionie: zwi\u0119kszania go przy uzyskaniu krytycznego obiektu i zmniejszania przy jego zwolnieniu. Regiony z niezerow\u0105 liczb\u0105 s\u0105 uwa\u017cane za \u201cprzypi\u0119te\u201d i nie s\u0105 ewakuowane podczas GC.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/454\">JEP 454: Foreign Function &amp; Memory API<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2.jpeg\" alt=\"\" class=\"wp-image-17264\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP 454 koncentruje si\u0119 na zast\u0105pieniu JNI prostszym, czytelnym API w \u201cczystej\u201d Javie, zapewniaj\u0105c jednocze\u015bnie lepsz\u0105 wydajno\u015b\u0107, szerokie wsparcie platform oraz sp\u00f3jno\u015b\u0107 i integralno\u015b\u0107 operacji na natywnym kodzie i danych.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Programi\u015bci Javy nie raz potrzebuj\u0105 pracowa\u0107 z zasobami znajduj\u0105cymi si\u0119 poza bezpo\u015bredni\u0105 kontrol\u0105 JVM, szczeg\u00f3lnie kodu napisanego w j\u0119zykach kompilowanych typu C i danych znajduj\u0105cej si\u0119 w natywnej pami\u0119ci. Jednocze\u015bnie, obecne API nie udost\u0119pniaj\u0105 na to \u0142atwego i bezpiecznego sposobu To ograniczenie utrudnia p\u0142ynn\u0105 interakcj\u0119 z innymi platformami oraz wykorzystanie natywnych bibliotek i danych, co jest mocn\u0105 stron\u0105 takiego cho\u0107by Pythona czy C.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 454 wprowadza API \u201cFunkcji Zewn\u0119trznych i Pami\u0119ci (FFM API)\u201d, aby sprosta\u0107 tym wyzwaniom. API pozwala programom Java na efektywne wywo\u0142ywanie funkcji zewn\u0119trznych (kodu spoza JVM) i bezpieczny dost\u0119p do zewn\u0119trznej pami\u0119ci (pami\u0119ci niezarz\u0105dzanej przez JVM), zast\u0119puj\u0105c kruche, niebezpieczne i og\u00f3lnie nielubiane JNI. API ma na celu umo\u017cliwienie programom Java wywo\u0142ywania natywnych bibliotek i przetwarzania danych natywnych bardziej niezawodnie (wprowadzenie typowania) i elastycznie.<\/p>\n\n\n\n<p><strong>Prosty przyk\u0142ad kodu:<\/strong> Prostym przypadkiem u\u017cycia API FFM jest uzyskanie uchwytu metody dla funkcji biblioteki C, takiej jak <code>radixsort<\/code>, i jej u\u017cycie do sortowania tablicy ci\u0105g\u00f3w znak\u00f3w zainicjowanej w Javie.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/456\">JEP 456: Unnamed Variables &amp; Patterns <\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3.jpeg\" alt=\"\" class=\"wp-image-17265\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP 456 ma na celu popraw\u0119 czytelno\u015bci i utrzymywalno\u015bci kodu poprzez umo\u017cliwienie deweloperom deklarowania zmiennych, kt\u00f3rych tworzenie jest wymagane w okre\u015blonych kontekstach, ale nie s\u0105 realnie u\u017cywane, a tak\u017ce popraw\u0119 obs\u0142ugi wzorc\u00f3w w instrukcjach switch i case\u200b\u200b\u200b\u200b.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Deweloperzy cz\u0119sto deklaruj\u0105 zmienne, kt\u00f3rych nie zamierzaj\u0105 u\u017cywa\u0107, czy to ze wzgl\u0119d\u00f3w stylistycznych, czy z powodu wymaga\u0144 sk\u0142adni j\u0119zyka. Niejawno\u015b\u0107 za\u0142o\u017cenia, \u017ce b\u0119d\u0105 one nieu\u017cywane mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w i niejasno\u015bci w kodzie. Mog\u0105 tak\u017ce myli\u0107 wszelkiej ma\u015bci lintery i inne narz\u0119dzia wspomagaj\u0105ce prace z kodem, kt\u00f3rych pojawia si\u0119 coraz wi\u0119cej.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 456 wprowadza \u201cnienazwane\u201d zmienne i wzorce, kt\u00f3re mo\u017cna stosowa\u0107, gdy deklaracje zmiennych lub zagnie\u017cd\u017cone wzorce s\u0105 wymagane, ale nigdy nie u\u017cywane. Oba typy s\u0105 oznaczane za pomoc\u0105 znaku podkre\u015blenia, _. Pozwala to na wyra\u017ane wskazanie, \u017ce dana zmienna lub parametr lambdy jest nieu\u017cywany, poprawiaj\u0105c tym samym czytelno\u015b\u0107 i utrzymywalno\u015b\u0107 kodu, a tak\u017ce lepsze wsparcie narz\u0119dzi.<\/p>\n\n\n\n<p><strong>W praktyce:<\/strong><br><em>Unnamed Variable<\/em><code>&lt;br&gt;for (Order _ : orders) { \/\/ Nieoznaczona zmienna&lt;br&gt;     total++;&lt;br&gt;} <\/code><\/p>\n\n\n\n<p><em>Unnamed Pattern<\/em><code>&lt;br&gt; switch (obj) {&lt;br&gt;     case Integer _:&lt;br&gt;         System.out.println(&quot;To jest Integer, ale jego warto\u015b\u0107 nie jest potrzebna.&quot;);&lt;br&gt;         break;&lt;br&gt;     \/\/ Inne przypadki...&lt;br&gt; }&lt;br&gt; <\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/458\">JEP 458: Launch Multi-File Source-Code Programs<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5.jpeg\" alt=\"\" class=\"wp-image-17270\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP 458 u\u0142atwia iteracyjne przej\u015bcie od tworzenia prostych program\u00f3w do bardziej z\u0142o\u017conych, umo\u017cliwiaj\u0105c p\u0142ynne tworzenie i uruchamianie aplikacji z\u0142o\u017conych z wielu plik\u00f3w \u017ar\u00f3d\u0142owych bez potrzeby manualnego kompilowania ka\u017cdej z nich.<\/p>\n\n\n\n<p>PS: Ca\u0142o\u015b\u0107 przyjemnie komponuje si\u0119 z <strong>463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/strong>, kt\u00f3ry znajdziecie troch\u0119 ni\u017cej<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Historycznie, uruchamianie program\u00f3w napisanych w Javie wymaga\u0142o kompilacji kodu \u017ar\u00f3d\u0142owego do plik\u00f3w <code>.class<\/code> przed wykonaniem. <a href=\"https:\/\/openjdk.org\/jeps\/330\">JEP 330<\/a> umo\u017cliwi\u0142 uruchamianie pojedynczych plik\u00f3w \u017ar\u00f3d\u0142owych bezpo\u015brednio, ale program musia\u0142 si\u0119 w ca\u0142o\u015b\u0107 mie\u015bci\u0107 w jednym pliku <code>.java<\/code>, a wiecie&#8230;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"202\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.gif\" alt=\"\" class=\"wp-image-17276\" style=\"width:990px;height:auto\"\/><\/figure><\/div>\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 458 rozszerza funkcjonalno\u015b\u0107 uruchamiania program\u00f3w przez polecenie <code>java<\/code>, umo\u017cliwiaj\u0105c uruchamianie program\u00f3w dostarczanych jako wiele plik\u00f3w \u017ar\u00f3d\u0142owych Java. Teraz mo\u017cliwe jest uruchomienie programu z\u0142o\u017conego z wielu plik\u00f3w <code>.java<\/code> bez konieczno\u015bci ich kompilacji, co u\u0142atwia pisanie skrypt\u00f3w.<\/p>\n\n\n\n<p><strong>W praktyce:<\/strong> Je\u015bli mamy dwa pliki, <a class=\"autolink\" href=\"https:\/\/Main.java\">Main.java<\/a> i <a class=\"autolink\" href=\"https:\/\/Helper.java\">Helper.java<\/a>, mo\u017cna uruchomi\u0107 <a class=\"autolink\" href=\"https:\/\/Main.java\">Main.java<\/a> za pomoc\u0105 <code>java Main.java<\/code>, a program automatycznie znajdzie i skompiluje <a class=\"autolink\" href=\"https:\/\/Helper.java\">Helper.java<\/a> (w niekt\u00f3rych przypadkach mo\u017ce by\u0107 niezb\u0119dne zdefiniowanie struktury czy classpath).<\/p>\n\n\n\n<h2 id=\"preview\" data-num=2>Preview<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(&#8230;) (Preview) <\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6.jpeg\" alt=\"\" class=\"wp-image-17272\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP wprowadza nowe poj\u0119cie \u201ekontekstu przed-konstrukcyjnego\u201d, kt\u00f3ry obejmuje zar\u00f3wno argumenty wyra\u017anego wywo\u0142ania konstruktora przez <code>super<\/code>, jak i wszystkie instrukcje, kt\u00f3re wyst\u0119puj\u0105 przed nim. W kontek\u015bcie tym obowi\u0105zuj\u0105 zasady podobne do normalnych metod instancji, z wyj\u0105tkiem, \u017ce kod nie mo\u017ce odnosi\u0107 si\u0119 do tworzonej instancji.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Dotychczas w konstruktorach wymagane by\u0142o, aby pierwsz\u0105 instrukcj\u0105 by\u0142 wywo\u0142anie konstruktora klasy nadrz\u0119dnej <code>super(...)<\/code> lub innego konstruktora tej samej klasy <code>this(...)<\/code>. To ograniczenie utrudnia\u0142o wstawienie logiki potrzebnej do stworzenia argument\u00f3w dla <code>super<\/code>, kt\u00f3ra musia\u0142a by\u0107 umieszczana w statycznych metodach pomocniczych, po\u015brednich konstruktorach pomocniczych lub argumentach konstruktora.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 447 wprowadza zmian\u0119 w \u201cgramatyce\u201d konstruktor\u00f3w, pozwalaj\u0105c na umieszczenie instrukcji, kt\u00f3re nie odnosz\u0105 si\u0119 do tworzonej instancji, przed wyra\u017anym wywo\u0142aniem konstruktora. Celem jest zapewnienie wi\u0119kszej swobody w wyra\u017caniu zachowania konstruktor\u00f3w, jednocze\u015bnie zachowuj\u0105c gwarancj\u0119, \u017ce konstruktory dzia\u0142aj\u0105 \u201cod g\u00f3ry do do\u0142u\u201d podczas tworzenia instancji klasy.<\/p>\n\n\n\n<p><strong>W praktyce:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class SubClass extends SuperClass {\n   SubClass(int param) {\n     \/\/ Logika przed konstruktorem klasy nadrz\u0119dnej\n    int calculatedValue = someStaticMethod(param);\n    super(calculatedValue); \/\/ Wywo\u0142anie konstruktora klasy nadrz\u0119dnej\n\n    \/\/ Dodatkowa logika po wywo\u0142aniu super(...)\n   }\n\n   private static int someStaticMethod(int param) {\n      return param * 2;\n }}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/457\">JEP 457: Class-File API (Preview)<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.jpeg\" alt=\"\" class=\"wp-image-17260\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>Celem JEP 457 jest dostarczy\u0107 standardowe API do parsowania, generowania i transformowania plik\u00f3w klas Java<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> W ekosystemie Javy, pliki klasy s\u0105 kluczowe do parsowania, generowania i transformacji. Istniej\u0105ce biblioteki do przetwarzania plik\u00f3w klasy, takie jak <strong>ASM<\/strong>, <strong>BCEL<\/strong> czy <strong>Javassist<\/strong>, nie zawsze nad\u0105\u017caj\u0105 za szybkimi zmianami formatu plik\u00f3w klasy wprowadzanymi w JDK. To prowadzi do problem\u00f3w z niezgodno\u015bci\u0105 wersji i b\u0142\u0119d\u00f3w widocznych dla programist\u00f3w aplikacji.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 457 proponuje standardowe API do parsowania, generowania i transformacji plik\u00f3w klasy Java, kt\u00f3re b\u0119dzie \u015bledzi\u0107 format pliku <code>class<\/code> zdefiniowany przez Specyfikacj\u0119 JVM. To umo\u017cliwi migracj\u0119 komponent\u00f3w JDK w\u0142a\u015bnie na nie, ostatecznie eliminuj\u0105c potrzeb\u0119 u\u017cywania wewn\u0119trznej kopii biblioteki ASM w JDK.<\/p>\n\n\n\n<p>Dlaczego teraz? Tw\u00f3rcy przekonuj\u0105, \u017ce ewolucja JVMa znacznie przyspieszy\u0142a i coraz wi\u0119cej zmian odbywa si\u0119 w\u0142a\u015bnie na poziomie generowanego kodu. Dzi\u0119ki nowemu API du\u017ce inicjatywy jak np. Valhalla ma by\u0107 mniej uci\u0105\u017cliwe dla ca\u0142ego ekosystemu.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad parsowania plik\u00f3w klasy z wzorcami:<\/strong><br><code>&lt;br&gt; CodeModel code = ...&lt;br&gt; Set&lt;ClassDesc&gt; deps = new HashSet&lt;&gt;();&lt;br&gt; for (CodeElement e : code) {&lt;br&gt;     switch (e) {&lt;br&gt;         case FieldInstruction f  -&gt; deps.add(f.owner());&lt;br&gt;         case InvokeInstruction i -&gt; deps.add(i.owner());&lt;br&gt;         \/\/ ... i tak dalej dla instanceof, cast, itd.&lt;br&gt;     }&lt;br&gt; }&lt;br&gt; <\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/459\">JEP 459: String Templates (Second Preview)<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1.jpeg\" alt=\"\" class=\"wp-image-17262\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP 459 wprowadza \u201cszablony tekstowe\u201d jako nowy rodzaj wyra\u017cenia w Javie. Szablony tekstowe u\u0142atwiaj\u0105 tworzenie d\u0142ugich ci\u0105g\u00f3w znak\u00f3w, \u0142\u0105cz\u0105c zhardcodowany tekst z osadzonymi wyra\u017ceniami i procesorami szablon\u00f3w, w celu uzyskania specjalizowanych wynik\u00f3w.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Programi\u015bci Java rutynowo tworz\u0105 ci\u0105gi znak\u00f3w, \u0142\u0105cz\u0105c tekst sta\u0142y z wyra\u017ceniami. Istniej\u0105ce metody sk\u0142adania ci\u0105g\u00f3w w Javie, takie jak konkatenacja za pomoc\u0105 operatora +, s\u0105 niewygodne i mog\u0105 prowadzi\u0107 do trudnego w utrzymaniu kodu.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong><br>String Templates to nowy rodzaj konstruktu w Java, kt\u00f3re umo\u017cliwiaj\u0105 interpolacj\u0119 ci\u0105g\u00f3w znak\u00f3w, ale w spos\u00f3b bardziej zaawansowany ni\u017c istniej\u0105ce rozwi\u0105zania. String Templates zapewniaj\u0105 bezpiecznie i efektywnie komponowa\u0107 ci\u0105gi znak\u00f3w.<br>Przyk\u0142adowo, procesor szablonu STR wykonuje interpolacj\u0119 ci\u0105g\u00f3w znak\u00f3w, zast\u0119puj\u0105c ka\u017cde osadzone wyra\u017cenie w szablonie jego (sformatowan\u0105) warto\u015bci\u0105.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad kodu:<\/strong><br><code>&lt;br&gt;\nString name = &quot;Joan&quot;;&lt;br&gt;\nString info = STR.&quot;My name is \\{name}&quot;;&lt;br&gt;\nassert info.equals(&quot;My name is Joan&quot;);   \/\/ true&lt;br&gt;\n<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/461\">JEP 461: Stream Gatherers (Preview) <\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8.jpeg\" alt=\"\" class=\"wp-image-17277\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>Interfejs Stream Gatherer reprezentuje transformacj\u0119 element\u00f3w Streamu. Gatherers mog\u0105 transformowa\u0107 elementy w r\u00f3\u017cnorodny spos\u00f3b: jeden do jednego, jeden do wielu, wiele do jednego, wiele do wielu. Mog\u0105 te\u017c \u015bledzi\u0107 wcze\u015bniej widziane elementy, aby wp\u0142yn\u0105\u0107 na transformacj\u0119 p\u00f3\u017aniejszych element\u00f3w, a tak\u017ce przerwa\u0107 przetwarzanie, aby przekszta\u0142ci\u0107 niesko\u0144czone strumienie na sko\u0144czone, umo\u017cliwiaj\u0105c ich zr\u00f3wnoleglone wykonanie.<\/p>\n\n\n\n<p><strong>Jaki problem rozwi\u0105zuj\u0105?:<\/strong> Chocia\u017c Stream API od czasu JDK 1.8 zapewnia bogaty zestaw operacji po\u015brednich i ko\u0144cowych, takich jak mapowanie, filtrowanie, redukcja czy sortowanie, nie posiada\u0142o mo\u017cliwo\u015bci rozszerzenia tego zestawu. To oznacza, \u017ce niekt\u00f3re z\u0142o\u017cone zadania nie mog\u0105 by\u0107 \u0142atwo wyra\u017cone jako streamy, poniewa\u017c niezb\u0119dna operacja po\u015brednia nie istnia\u0142a.<\/p>\n\n\n\n<p><strong>Co przynosi JEP:<\/strong> JEP 461 wprowadza operacj\u0119 po\u015bredni\u0105 <code>Stream::gather(Gatherer)<\/code> do Stream API, umo\u017cliwiaj\u0105c\u0105 przetwarzanie element\u00f3w strumienia za pomoc\u0105 zdefiniowanego przez u\u017cytkownika zbioru operacji zwanych &#8222;gathererami\u201d. Pozwala to na rozszerzenie mo\u017cliwo\u015bci Stream API, kt\u00f3re teraz odwzorowa\u0107 mog\u0105 prawie ka\u017cd\u0105 operacj\u0119 po\u015bredni\u0105.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad kodu:<\/strong><br>Za\u0142\u00f3\u017cmy, \u017ce zadanie polega na wzi\u0119ciu strumienia ci\u0105g\u00f3w znak\u00f3w i uczynieniu go unikalnym, ale z unikalno\u015bci\u0105 opart\u0105 na d\u0142ugo\u015bci ci\u0105gu, a nie na jego zawarto\u015bci:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var result = Stream.of(&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;)\n        .gather(new DistinctByLengthGatherer())\n        .toList();                   \n\npublic class DistinctByLengthGatherer implements Gatherer&lt;String, String, Set&lt;Integer&gt;, List&lt;String&gt;&gt; {\n    @Override\n    public Supplier&lt;Set&lt;Integer&gt;&gt; supplier() {\n        return HashSet::new;\n    }\n\n    @Override\n    public BiConsumer&lt;Set&lt;Integer&gt;, String&gt; accumulator() {\n        return (seen, string) -&gt; {\n            if (seen.add(string.length())) {\n                seen.add(string);\n            }\n        };\n    }\n\n    @Override\n    public BinaryOperator&lt;Set&lt;Integer&gt;&gt; combiner() {\n        return (seen1, seen2) -&gt; {\n            seen1.addAll(seen2);\n            return seen1;\n        };\n    }\n\n    @Override\n    public Function&lt;Set&lt;Integer&gt;, List&lt;String&gt;&gt; finisher() {\n        return ArrayList::new;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>W tym przyk\u0142adzie, hipotetyczna operacja <code>.gather(new DistinctByLengthGatherer())<\/code> jest przyk\u0142adem zastosowania Gatherera.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/462\">JEP 462: Structured Concurrency (Second Preview)<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9.jpeg\" alt=\"\" class=\"wp-image-17280\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP 462 wprowadza API dla strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, co u\u0142atwia zarz\u0105dzanie grupami powi\u0105zanych zada\u0144 dzia\u0142aj\u0105cych w r\u00f3\u017cnych w\u0105tkach jako pojedyncz\u0105 jednostk\u0119 pracy. To podej\u015bcie upraszcza obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i anulowanie, poprawiaj\u0105c niezawodno\u015b\u0107 i obserwowalno\u015b\u0107.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Programowanie wsp\u00f3\u0142bie\u017cne mo\u017ce by\u0107 skomplikowane, szczeg\u00f3lnie przy zarz\u0105dzaniu wieloma zadaniami wykonywanymi r\u00f3wnolegle. Istniej\u0105ce podej\u015bcia cz\u0119sto wi\u0105\u017c\u0105 si\u0119 z ryzykiem wyciek\u00f3w w\u0105tk\u00f3w, op\u00f3\u017anie\u0144 w anulowaniu, a tak\u017ce problemami z obserwowalno\u015bci\u0105 kodu wsp\u00f3\u0142bie\u017cnego.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong><br>Kluczow\u0105 klas\u0105 API strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci jest <code>StructuredTaskScope<\/code> z pakietu <code>java.util.concurrent<\/code>. Pozwala ona strukturyzowa\u0107 zadanie jako grup\u0105 wsp\u00f3\u0142bie\u017cnych podzada\u0144 i koordynowa\u0107 ich jako jednostki w ramach konkretnej struktury. Podzadania s\u0105 wykonywane w w\u0142asnych w\u0105tkach, a nast\u0119pnie zarz\u0105dzanie, \u0142\u0105czone i anulowane, w tym anulowane kaskadowo.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad u\u017cycia:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Response handle() throws ExecutionException, InterruptedException {\n  try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n    Supplier user = scope.fork(() -&gt; findUser());\n    Supplier order = scope.fork(() -&gt; fetchOrder());\n    scope.join()            \n         .throwIfFailed(); \n\n    return new Response(user.get(), order.get());\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/463\">JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7.jpeg\" alt=\"\" class=\"wp-image-17274\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>Wprowadza mo\u017cliwo\u015b\u0107 pisania metody <code>main<\/code> bezpo\u015brednio na poziomie pliku \u017ar\u00f3d\u0142owego, bez konieczno\u015bci umieszczania ich w klasie, co upraszcza struktur\u0119 kodu, szczeg\u00f3lnie dla pocz\u0105tkuj\u0105cych.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Java, b\u0119d\u0105c dobrym narz\u0119dziem do tworzenia du\u017cych, z\u0142o\u017conych aplikacji, mo\u017ce by\u0107 wyzwaniem dla pocz\u0105tkuj\u0105cych programist\u00f3w, zw\u0142aszcza w por\u00f3wnaniu z takim Pythonem. Pierwsze kroki w nauce Javy cz\u0119sto wi\u0105\u017c\u0105 si\u0119 z konieczno\u015bci\u0105 zrozumienia i stosowania skomplikowanych koncept\u00f3w, kt\u00f3re s\u0105 niepotrzebne przy pisaniu prostych program\u00f3w.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 463 wprowadza do Javy niejawnie deklarowane klasy i metody main dla instancji, co u\u0142atwia pisanie prostych program\u00f3w. Pozwala to na bardziej intuicyjne i mniej obci\u0105\u017caj\u0105ce podej\u015bcie do tworzenia pocz\u0105tkowych program\u00f3w, jednocze\u015bnie zachowuj\u0105c pe\u0142n\u0105 kompatybilno\u015b\u0107 i mo\u017cliwo\u015b\u0107 rozszerzenia do bardziej zaawansowanych funkcji j\u0119zyka, gdy umiej\u0119tno\u015bci programisty rosn\u0105.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad w praktyce:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void main() {\n    System.out.println(&quot;Hello, World!&quot;);\n}<\/code><\/pre>\n\n\n\n<p>Ten przyk\u0142ad pokazuje, jak za pomoc\u0105 uproszczonej struktury mo\u017cna napisa\u0107 program wypisuj\u0105cy &#8222;Hello, World!&#8221; bez konieczno\u015bci jawnego deklarowania klasy i statycznej metody main.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/464\">JEP 464: Scoped Values (Second Preview)<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10.jpeg\" alt=\"\" class=\"wp-image-17282\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p>JEP 464 wprowadza &#8222;scoped values&#8221;, kt\u00f3re umo\u017cliwiaj\u0105 bezpieczne i wydajne przekazywanie \u201cuwi\u0119zionych\u201d w konkretnym scope, niemutowalnych danych w obr\u0119bie pojedynczego w\u0105tku, a tak\u017ce mi\u0119dzy nimi. Stanowi\u0105 one preferowan\u0105 alternatyw\u0119 dla <code>Thread.Local<\/code>, szczeg\u00f3lnie przy u\u017cyciu du\u017cej liczby wirtualnych w\u0105tk\u00f3w.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> W Java, metody cz\u0119sto wymagaj\u0105 przekazywania danych jako parametr\u00f3w, co mo\u017ce by\u0107 niepraktyczne, gdy ka\u017cdy po\u015bredni wywo\u0142ywany potrzebuje r\u00f3\u017cnych danych. Cz\u0119sto tworzony jest wi\u0119c mutowany kontekst, kt\u00f3ry jest swoistym \u201cworkiem na dane\u201d, przekazywanym za pomoc\u0105 parametr\u00f3w lub trzymany w pami\u0119ci w\u0105tku\u201d<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> &#8222;Scoped values&#8221; pozwalaj\u0105 na udost\u0119pnianie danych mi\u0119dzy metodami w du\u017cym programie bez u\u017cycia parametr\u00f3w metod. S\u0105 one typu <code>ScopedValue<\/code> i zwykle deklarowane jako <code>final static<\/code> z prywatnym dost\u0119pem, aby zapobiec bezpo\u015bredniemu dost\u0119powi z innych klas.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"211\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.png\" alt=\"\" class=\"wp-image-17258\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.png 640w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-300x99.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption class=\"wp-element-caption\">Pomys\u0142 wykonania tego zadania zosta\u0142 zaczerpni\u0119ty z Common Lispa i jego &#8222;zmiennych specjalnych&#8221;<\/figcaption><\/figure><\/div>\n\n\n<p><strong>Przyk\u0142ad u\u017cycia:<\/strong><code>&lt;br&gt;ScopedValue.where(NAME, &lt;value&gt;)&lt;br&gt;      .run(() -&gt; { ... NAME.get() ... call methods ... });<\/code><\/p>\n\n\n\n<p>W tym przyk\u0142adzie, <code>ScopedValue.where<\/code> definiuje scoped value i obiekt, do kt\u00f3rego ma by\u0107 zwi\u0105zany. Wywo\u0142anie <code>run<\/code> wi\u0105\u017ce scoped value, dostarczaj\u0105c kopi\u0119 specyficzn\u0105 dla bie\u017c\u0105cego w\u0105tku, a nast\u0119pnie wykonuje przekazane wyra\u017cenie lambda. Podczas trwania wywo\u0142ania <code>run<\/code>, wyra\u017cenie lambda lub ka\u017cda metoda wywo\u0142ana bezpo\u015brednio lub po\u015brednio z tego wyra\u017cenia, mo\u017ce odczyta\u0107 scoped value za pomoc\u0105 metody <code>get()<\/code>.<\/p>\n\n\n\n<h2 id=\"inkubacja\" data-num=3>Inkubacja<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/464\">JEP 460: Vector API (Seventh Incubator)<\/a><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1792\" height=\"1024\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11.jpeg\" alt=\"\" class=\"wp-image-17284\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11.jpeg 1792w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11-300x171.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11-1024x585.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11-768x439.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11-1536x878.jpeg 1536w\" sizes=\"auto, (max-width: 1792px) 100vw, 1792px\" \/><\/figure><\/div>\n\n\n<p><strong>Kr\u00f3tki opis:<\/strong> JEP 460 rozwija API umo\u017cliwiaj\u0105ce wyra\u017cenie oblicze\u0144 wektorowych, kompiluj\u0105cych si\u0119 do natywnych instrukcji wektorowych na obs\u0142ugiwanych architekturach CPU, zapewniaj\u0105c wydajno\u015b\u0107 przewy\u017cszaj\u0105c\u0105 r\u00f3wnowa\u017cne obliczenia skalarne.<\/p>\n\n\n\n<p><strong>Pierwotny problem:<\/strong> Obliczenia wektorowe, kt\u00f3re pozwalaj\u0105 na r\u00f3wnoczesne wykonywanie operacji na wielu danych, by\u0142y trudne do wyra\u017cenia w Javie i zale\u017ca\u0142y od algorytmu auto-wektoryzacji HotSpot, co ogranicza\u0142o ich u\u017cyteczno\u015b\u0107 i wydajno\u015b\u0107 w praktyce.<\/p>\n\n\n\n<p><strong>Rozwi\u0105zanie:<\/strong> Vector API w Javie umo\u017cliwia tworzenie z\u0142o\u017conych algorytm\u00f3w wektorowych z wi\u0119ksz\u0105 przewidywalno\u015bci\u0105 i niezawodno\u015bci\u0105, z wykorzystaniem istniej\u0105cego auto-wektoryzatora HotSpot, ale z bardziej przewidywalnym modelem dla u\u017cytkownika.<\/p>\n\n\n\n<p><strong>Co si\u0119 zmieni\u0142o od poprzedniego inkubatora:<\/strong> W JDK 22, API zosta\u0142o ponownie wprowadzone do inkubacji z drobnymi usprawnieniami w stosunku do JDK 21, w tym poprawkami b\u0142\u0119d\u00f3w i usprawnieniami wydajno\u015bci. Dalej czeka ono na finalizacje prac nad Project Valhalla.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Od dzisiaj nowa Java wchodzi w faz\u0119 Rampdown \u2013 oznacza to, \u017ce lista funkcji zosta\u0142a zamro\u017cona i nie nale\u017cy spodziewa\u0107 si\u0119 dalszych nowo\u015bci. Dlatego przejdziemy sobie przez pe\u0142n\u0105 list\u0119 zmian w nowej edycji.<\/p>\n","protected":false},"author":10,"featured_media":17253,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-17250","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"13","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.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>Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156 - 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\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156 - Vived\" \/>\n<meta property=\"og:description\" content=\"Od dzisiaj nowa Java wchodzi w faz\u0119 Rampdown \u2013 oznacza to, \u017ce lista funkcji zosta\u0142a zamro\u017cona i nie nale\u017cy spodziewa\u0107 si\u0119 dalszych nowo\u015bci. Dlatego przejdziemy sobie przez pe\u0142n\u0105 list\u0119 zmian w nowej edycji.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-07T11:12:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-07T14:34:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.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\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156\",\"datePublished\":\"2023-12-07T11:12:49+00:00\",\"dateModified\":\"2023-12-07T14:34:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\"},\"wordCount\":2340,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\",\"url\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\",\"name\":\"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png\",\"datePublished\":\"2023-12-07T11:12:49+00:00\",\"dateModified\":\"2023-12-07T14:34:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156\"}]},{\"@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":"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156 - 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\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/","og_locale":"pl_PL","og_type":"article","og_title":"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156 - Vived","og_description":"Od dzisiaj nowa Java wchodzi w faz\u0119 Rampdown \u2013 oznacza to, \u017ce lista funkcji zosta\u0142a zamro\u017cona i nie nale\u017cy spodziewa\u0107 si\u0119 dalszych nowo\u015bci. Dlatego przejdziemy sobie przez pe\u0142n\u0105 list\u0119 zmian w nowej edycji.","og_url":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/","og_site_name":"Vived","article_published_time":"2023-12-07T11:12:49+00:00","article_modified_time":"2023-12-07T14:34:01+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.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\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156","datePublished":"2023-12-07T11:12:49+00:00","dateModified":"2023-12-07T14:34:01+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/"},"wordCount":2340,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/","url":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/","name":"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png","datePublished":"2023-12-07T11:12:49+00:00","dateModified":"2023-12-07T14:34:01+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/Twitter-post-1200x628-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-22-co-przyniesie-nowa-edycja-jvm-weekly-vol-156\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Feature Freeze dla JDK 22 \u2013 co przyniesie nowa edycja? JVM Weekly vol. 156"}]},{"@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\">Stable<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Stable<\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/423\">JEP 423: Region Pinning for G1<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/423\">JEP 423: Region Pinning for G1<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17309,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-17309\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-17309\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 423 ma na celu zredukowanie op\u00f3\u017anie\u0144 w G1 poprzez implementacj\u0119 tak zwanego \u201cprzypinania region\u00f3w\u201d, dzi\u0119ki czemu nie ma potrzeby wy\u0142\u0105czania mechanizm\u00f3w Garbage Collection w <em>krytycznych regionach<\/em> Java Native Interface.<\/p>\n","innerContent":["\n<p>JEP 423 ma na celu zredukowanie op\u00f3\u017anie\u0144 w G1 poprzez implementacj\u0119 tak zwanego \u201cprzypinania region\u00f3w\u201d, dzi\u0119ki czemu nie ma potrzeby wy\u0142\u0105czania mechanizm\u00f3w Garbage Collection w <em>krytycznych regionach<\/em> Java Native Interface.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Krytyczny region JNI odnosi si\u0119 do specyficznej sekcji kodu, w kt\u00f3rej w\u0105tek Javy uzyskuje bezpo\u015bredni dost\u0119p do obiekt\u00f3w Javy. W tym regionie, w\u0105tek mo\u017ce bezpo\u015brednio manipulowa\u0107 danymi obiektu, co jest kluczowe dla wsp\u00f3\u0142pracy z \u201cniezarz\u0105dzanymi\u201d j\u0119zykami programowania, takimi jak C i C++. Oryginalny JEP do\u015b\u0107 przyst\u0119pnie opisuje ten koncept.<\/p>\n","innerContent":["\n<p>Krytyczny region JNI odnosi si\u0119 do specyficznej sekcji kodu, w kt\u00f3rej w\u0105tek Javy uzyskuje bezpo\u015bredni dost\u0119p do obiekt\u00f3w Javy. W tym regionie, w\u0105tek mo\u017ce bezpo\u015brednio manipulowa\u0107 danymi obiektu, co jest kluczowe dla wsp\u00f3\u0142pracy z \u201cniezarz\u0105dzanymi\u201d j\u0119zykami programowania, takimi jak C i C++. Oryginalny JEP do\u015b\u0107 przyst\u0119pnie opisuje ten koncept.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Kiedy w\u0105tek znajduje si\u0119 w krytycznym regionie JNI, JVM musia\u0142 unika\u0107 przesuwania znajduj\u0105cych si\u0119 w nim obiekt\u00f3w podczas procesu od\u015bmiecania. G1 dezaktywuje GC w ka\u017cdym krytycznym regionie, co znacz\u0105co wp\u0142ywa na jego op\u00f3\u017anienia w przypadku kodu JNI.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Kiedy w\u0105tek znajduje si\u0119 w krytycznym regionie JNI, JVM musia\u0142 unika\u0107 przesuwania znajduj\u0105cych si\u0119 w nim obiekt\u00f3w podczas procesu od\u015bmiecania. G1 dezaktywuje GC w ka\u017cdym krytycznym regionie, co znacz\u0105co wp\u0142ywa na jego op\u00f3\u017anienia w przypadku kodu JNI.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP rozszerza G1 o mo\u017cliwo\u015b\u0107 <em>przypinania<\/em> dowolnych region\u00f3w. Polega to na utrzymaniu licznika krytycznych obiekt\u00f3w w ka\u017cdym regionie: zwi\u0119kszania go przy uzyskaniu krytycznego obiektu i zmniejszania przy jego zwolnieniu. Regiony z niezerow\u0105 liczb\u0105 s\u0105 uwa\u017cane za \u201cprzypi\u0119te\u201d i nie s\u0105 ewakuowane podczas GC.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP rozszerza G1 o mo\u017cliwo\u015b\u0107 <em>przypinania<\/em> dowolnych region\u00f3w. Polega to na utrzymaniu licznika krytycznych obiekt\u00f3w w ka\u017cdym regionie: zwi\u0119kszania go przy uzyskaniu krytycznego obiektu i zmniejszania przy jego zwolnieniu. Regiony z niezerow\u0105 liczb\u0105 s\u0105 uwa\u017cane za \u201cprzypi\u0119te\u201d i nie s\u0105 ewakuowane podczas GC.<\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/454\">JEP 454: Foreign Function &amp; Memory API<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/454\">JEP 454: Foreign Function &amp; Memory API<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17264,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2.jpeg\" alt=\"\" class=\"wp-image-17264\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-2.jpeg\" alt=\"\" class=\"wp-image-17264\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 454 koncentruje si\u0119 na zast\u0105pieniu JNI prostszym, czytelnym API w \u201cczystej\u201d Javie, zapewniaj\u0105c jednocze\u015bnie lepsz\u0105 wydajno\u015b\u0107, szerokie wsparcie platform oraz sp\u00f3jno\u015b\u0107 i integralno\u015b\u0107 operacji na natywnym kodzie i danych.<\/p>\n","innerContent":["\n<p>JEP 454 koncentruje si\u0119 na zast\u0105pieniu JNI prostszym, czytelnym API w \u201cczystej\u201d Javie, zapewniaj\u0105c jednocze\u015bnie lepsz\u0105 wydajno\u015b\u0107, szerokie wsparcie platform oraz sp\u00f3jno\u015b\u0107 i integralno\u015b\u0107 operacji na natywnym kodzie i danych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Programi\u015bci Javy nie raz potrzebuj\u0105 pracowa\u0107 z zasobami znajduj\u0105cymi si\u0119 poza bezpo\u015bredni\u0105 kontrol\u0105 JVM, szczeg\u00f3lnie kodu napisanego w j\u0119zykach kompilowanych typu C i danych znajduj\u0105cej si\u0119 w natywnej pami\u0119ci. Jednocze\u015bnie, obecne API nie udost\u0119pniaj\u0105 na to \u0142atwego i bezpiecznego sposobu To ograniczenie utrudnia p\u0142ynn\u0105 interakcj\u0119 z innymi platformami oraz wykorzystanie natywnych bibliotek i danych, co jest mocn\u0105 stron\u0105 takiego cho\u0107by Pythona czy C.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Programi\u015bci Javy nie raz potrzebuj\u0105 pracowa\u0107 z zasobami znajduj\u0105cymi si\u0119 poza bezpo\u015bredni\u0105 kontrol\u0105 JVM, szczeg\u00f3lnie kodu napisanego w j\u0119zykach kompilowanych typu C i danych znajduj\u0105cej si\u0119 w natywnej pami\u0119ci. Jednocze\u015bnie, obecne API nie udost\u0119pniaj\u0105 na to \u0142atwego i bezpiecznego sposobu To ograniczenie utrudnia p\u0142ynn\u0105 interakcj\u0119 z innymi platformami oraz wykorzystanie natywnych bibliotek i danych, co jest mocn\u0105 stron\u0105 takiego cho\u0107by Pythona czy C.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 454 wprowadza API \u201cFunkcji Zewn\u0119trznych i Pami\u0119ci (FFM API)\u201d, aby sprosta\u0107 tym wyzwaniom. API pozwala programom Java na efektywne wywo\u0142ywanie funkcji zewn\u0119trznych (kodu spoza JVM) i bezpieczny dost\u0119p do zewn\u0119trznej pami\u0119ci (pami\u0119ci niezarz\u0105dzanej przez JVM), zast\u0119puj\u0105c kruche, niebezpieczne i og\u00f3lnie nielubiane JNI. API ma na celu umo\u017cliwienie programom Java wywo\u0142ywania natywnych bibliotek i przetwarzania danych natywnych bardziej niezawodnie (wprowadzenie typowania) i elastycznie.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 454 wprowadza API \u201cFunkcji Zewn\u0119trznych i Pami\u0119ci (FFM API)\u201d, aby sprosta\u0107 tym wyzwaniom. API pozwala programom Java na efektywne wywo\u0142ywanie funkcji zewn\u0119trznych (kodu spoza JVM) i bezpieczny dost\u0119p do zewn\u0119trznej pami\u0119ci (pami\u0119ci niezarz\u0105dzanej przez JVM), zast\u0119puj\u0105c kruche, niebezpieczne i og\u00f3lnie nielubiane JNI. API ma na celu umo\u017cliwienie programom Java wywo\u0142ywania natywnych bibliotek i przetwarzania danych natywnych bardziej niezawodnie (wprowadzenie typowania) i elastycznie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Prosty przyk\u0142ad kodu:<\/strong> Prostym przypadkiem u\u017cycia API FFM jest uzyskanie uchwytu metody dla funkcji biblioteki C, takiej jak <code>radixsort<\/code>, i jej u\u017cycie do sortowania tablicy ci\u0105g\u00f3w znak\u00f3w zainicjowanej w Javie.<\/p>\n","innerContent":["\n<p><strong>Prosty przyk\u0142ad kodu:<\/strong> Prostym przypadkiem u\u017cycia API FFM jest uzyskanie uchwytu metody dla funkcji biblioteki C, takiej jak <code>radixsort<\/code>, i jej u\u017cycie do sortowania tablicy ci\u0105g\u00f3w znak\u00f3w zainicjowanej w Javie.<\/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\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/456\">JEP 456: Unnamed Variables &amp; Patterns <\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/456\">JEP 456: Unnamed Variables &amp; Patterns <\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17265,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3.jpeg\" alt=\"\" class=\"wp-image-17265\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-3.jpeg\" alt=\"\" class=\"wp-image-17265\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 456 ma na celu popraw\u0119 czytelno\u015bci i utrzymywalno\u015bci kodu poprzez umo\u017cliwienie deweloperom deklarowania zmiennych, kt\u00f3rych tworzenie jest wymagane w okre\u015blonych kontekstach, ale nie s\u0105 realnie u\u017cywane, a tak\u017ce popraw\u0119 obs\u0142ugi wzorc\u00f3w w instrukcjach switch i case\u200b\u200b\u200b\u200b.<\/p>\n","innerContent":["\n<p>JEP 456 ma na celu popraw\u0119 czytelno\u015bci i utrzymywalno\u015bci kodu poprzez umo\u017cliwienie deweloperom deklarowania zmiennych, kt\u00f3rych tworzenie jest wymagane w okre\u015blonych kontekstach, ale nie s\u0105 realnie u\u017cywane, a tak\u017ce popraw\u0119 obs\u0142ugi wzorc\u00f3w w instrukcjach switch i case\u200b\u200b\u200b\u200b.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Deweloperzy cz\u0119sto deklaruj\u0105 zmienne, kt\u00f3rych nie zamierzaj\u0105 u\u017cywa\u0107, czy to ze wzgl\u0119d\u00f3w stylistycznych, czy z powodu wymaga\u0144 sk\u0142adni j\u0119zyka. Niejawno\u015b\u0107 za\u0142o\u017cenia, \u017ce b\u0119d\u0105 one nieu\u017cywane mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w i niejasno\u015bci w kodzie. Mog\u0105 tak\u017ce myli\u0107 wszelkiej ma\u015bci lintery i inne narz\u0119dzia wspomagaj\u0105ce prace z kodem, kt\u00f3rych pojawia si\u0119 coraz wi\u0119cej.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Deweloperzy cz\u0119sto deklaruj\u0105 zmienne, kt\u00f3rych nie zamierzaj\u0105 u\u017cywa\u0107, czy to ze wzgl\u0119d\u00f3w stylistycznych, czy z powodu wymaga\u0144 sk\u0142adni j\u0119zyka. Niejawno\u015b\u0107 za\u0142o\u017cenia, \u017ce b\u0119d\u0105 one nieu\u017cywane mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w i niejasno\u015bci w kodzie. Mog\u0105 tak\u017ce myli\u0107 wszelkiej ma\u015bci lintery i inne narz\u0119dzia wspomagaj\u0105ce prace z kodem, kt\u00f3rych pojawia si\u0119 coraz wi\u0119cej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 456 wprowadza \u201cnienazwane\u201d zmienne i wzorce, kt\u00f3re mo\u017cna stosowa\u0107, gdy deklaracje zmiennych lub zagnie\u017cd\u017cone wzorce s\u0105 wymagane, ale nigdy nie u\u017cywane. Oba typy s\u0105 oznaczane za pomoc\u0105 znaku podkre\u015blenia, _. Pozwala to na wyra\u017ane wskazanie, \u017ce dana zmienna lub parametr lambdy jest nieu\u017cywany, poprawiaj\u0105c tym samym czytelno\u015b\u0107 i utrzymywalno\u015b\u0107 kodu, a tak\u017ce lepsze wsparcie narz\u0119dzi.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 456 wprowadza \u201cnienazwane\u201d zmienne i wzorce, kt\u00f3re mo\u017cna stosowa\u0107, gdy deklaracje zmiennych lub zagnie\u017cd\u017cone wzorce s\u0105 wymagane, ale nigdy nie u\u017cywane. Oba typy s\u0105 oznaczane za pomoc\u0105 znaku podkre\u015blenia, _. Pozwala to na wyra\u017ane wskazanie, \u017ce dana zmienna lub parametr lambdy jest nieu\u017cywany, poprawiaj\u0105c tym samym czytelno\u015b\u0107 i utrzymywalno\u015b\u0107 kodu, a tak\u017ce lepsze wsparcie narz\u0119dzi.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>W praktyce:<\/strong><br><em>Unnamed Variable<\/em><code><br>for (Order _ : orders) { \/\/ Nieoznaczona zmienna<br>     total++;<br>} <\/code><\/p>\n","innerContent":["\n<p><strong>W praktyce:<\/strong><br><em>Unnamed Variable<\/em><code><br>for (Order _ : orders) { \/\/ Nieoznaczona zmienna<br>     total++;<br>} <\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><em>Unnamed Pattern<\/em><code><br> switch (obj) {<br>     case Integer _:<br>         System.out.println(\"To jest Integer, ale jego warto\u015b\u0107 nie jest potrzebna.\");<br>         break;<br>     \/\/ Inne przypadki...<br> }<br> <\/code><\/p>\n","innerContent":["\n<p><em>Unnamed Pattern<\/em><code><br> switch (obj) {<br>     case Integer _:<br>         System.out.println(\"To jest Integer, ale jego warto\u015b\u0107 nie jest potrzebna.\");<br>         break;<br>     \/\/ Inne przypadki...<br> }<br> <\/code><\/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\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/458\">JEP 458: Launch Multi-File Source-Code Programs<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/458\">JEP 458: Launch Multi-File Source-Code Programs<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17270,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5.jpeg\" alt=\"\" class=\"wp-image-17270\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-5.jpeg\" alt=\"\" class=\"wp-image-17270\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 458 u\u0142atwia iteracyjne przej\u015bcie od tworzenia prostych program\u00f3w do bardziej z\u0142o\u017conych, umo\u017cliwiaj\u0105c p\u0142ynne tworzenie i uruchamianie aplikacji z\u0142o\u017conych z wielu plik\u00f3w \u017ar\u00f3d\u0142owych bez potrzeby manualnego kompilowania ka\u017cdej z nich.<\/p>\n","innerContent":["\n<p>JEP 458 u\u0142atwia iteracyjne przej\u015bcie od tworzenia prostych program\u00f3w do bardziej z\u0142o\u017conych, umo\u017cliwiaj\u0105c p\u0142ynne tworzenie i uruchamianie aplikacji z\u0142o\u017conych z wielu plik\u00f3w \u017ar\u00f3d\u0142owych bez potrzeby manualnego kompilowania ka\u017cdej z nich.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS: Ca\u0142o\u015b\u0107 przyjemnie komponuje si\u0119 z <strong>463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/strong>, kt\u00f3ry znajdziecie troch\u0119 ni\u017cej<\/p>\n","innerContent":["\n<p>PS: Ca\u0142o\u015b\u0107 przyjemnie komponuje si\u0119 z <strong>463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/strong>, kt\u00f3ry znajdziecie troch\u0119 ni\u017cej<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Historycznie, uruchamianie program\u00f3w napisanych w Javie wymaga\u0142o kompilacji kodu \u017ar\u00f3d\u0142owego do plik\u00f3w <code>.class<\/code> przed wykonaniem. <a href=\"https:\/\/openjdk.org\/jeps\/330\">JEP 330<\/a> umo\u017cliwi\u0142 uruchamianie pojedynczych plik\u00f3w \u017ar\u00f3d\u0142owych bezpo\u015brednio, ale program musia\u0142 si\u0119 w ca\u0142o\u015b\u0107 mie\u015bci\u0107 w jednym pliku <code>.java<\/code>, a wiecie...<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Historycznie, uruchamianie program\u00f3w napisanych w Javie wymaga\u0142o kompilacji kodu \u017ar\u00f3d\u0142owego do plik\u00f3w <code>.class<\/code> przed wykonaniem. <a href=\"https:\/\/openjdk.org\/jeps\/330\">JEP 330<\/a> umo\u017cliwi\u0142 uruchamianie pojedynczych plik\u00f3w \u017ar\u00f3d\u0142owych bezpo\u015brednio, ale program musia\u0142 si\u0119 w ca\u0142o\u015b\u0107 mie\u015bci\u0107 w jednym pliku <code>.java<\/code>, a wiecie...<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17276,"width":"990px","height":"auto"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.gif\" alt=\"\" class=\"wp-image-17276\" style=\"width:990px;height:auto\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.gif\" alt=\"\" class=\"wp-image-17276\" style=\"width:990px;height:auto\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 458 rozszerza funkcjonalno\u015b\u0107 uruchamiania program\u00f3w przez polecenie <code>java<\/code>, umo\u017cliwiaj\u0105c uruchamianie program\u00f3w dostarczanych jako wiele plik\u00f3w \u017ar\u00f3d\u0142owych Java. Teraz mo\u017cliwe jest uruchomienie programu z\u0142o\u017conego z wielu plik\u00f3w <code>.java<\/code> bez konieczno\u015bci ich kompilacji, co u\u0142atwia pisanie skrypt\u00f3w.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 458 rozszerza funkcjonalno\u015b\u0107 uruchamiania program\u00f3w przez polecenie <code>java<\/code>, umo\u017cliwiaj\u0105c uruchamianie program\u00f3w dostarczanych jako wiele plik\u00f3w \u017ar\u00f3d\u0142owych Java. Teraz mo\u017cliwe jest uruchomienie programu z\u0142o\u017conego z wielu plik\u00f3w <code>.java<\/code> bez konieczno\u015bci ich kompilacji, co u\u0142atwia pisanie skrypt\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>W praktyce:<\/strong> Je\u015bli mamy dwa pliki, <a class=\"autolink\" href=\"https:\/\/Main.java\">Main.java<\/a> i <a class=\"autolink\" href=\"https:\/\/Helper.java\">Helper.java<\/a>, mo\u017cna uruchomi\u0107 <a class=\"autolink\" href=\"https:\/\/Main.java\">Main.java<\/a> za pomoc\u0105 <code>java Main.java<\/code>, a program automatycznie znajdzie i skompiluje <a class=\"autolink\" href=\"https:\/\/Helper.java\">Helper.java<\/a> (w niekt\u00f3rych przypadkach mo\u017ce by\u0107 niezb\u0119dne zdefiniowanie struktury czy classpath).<\/p>\n","innerContent":["\n<p><strong>W praktyce:<\/strong> Je\u015bli mamy dwa pliki, <a class=\"autolink\" href=\"https:\/\/Main.java\">Main.java<\/a> i <a class=\"autolink\" href=\"https:\/\/Helper.java\">Helper.java<\/a>, mo\u017cna uruchomi\u0107 <a class=\"autolink\" href=\"https:\/\/Main.java\">Main.java<\/a> za pomoc\u0105 <code>java Main.java<\/code>, a program automatycznie znajdzie i skompiluje <a class=\"autolink\" href=\"https:\/\/Helper.java\">Helper.java<\/a> (w niekt\u00f3rych przypadkach mo\u017ce by\u0107 niezb\u0119dne zdefiniowanie struktury czy classpath).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Preview<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Preview<\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(...) (Preview) <\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(...) (Preview) <\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17272,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6.jpeg\" alt=\"\" class=\"wp-image-17272\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-6.jpeg\" alt=\"\" class=\"wp-image-17272\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP wprowadza nowe poj\u0119cie \u201ekontekstu przed-konstrukcyjnego\u201d, kt\u00f3ry obejmuje zar\u00f3wno argumenty wyra\u017anego wywo\u0142ania konstruktora przez <code>super<\/code>, jak i wszystkie instrukcje, kt\u00f3re wyst\u0119puj\u0105 przed nim. W kontek\u015bcie tym obowi\u0105zuj\u0105 zasady podobne do normalnych metod instancji, z wyj\u0105tkiem, \u017ce kod nie mo\u017ce odnosi\u0107 si\u0119 do tworzonej instancji.<\/p>\n","innerContent":["\n<p>JEP wprowadza nowe poj\u0119cie \u201ekontekstu przed-konstrukcyjnego\u201d, kt\u00f3ry obejmuje zar\u00f3wno argumenty wyra\u017anego wywo\u0142ania konstruktora przez <code>super<\/code>, jak i wszystkie instrukcje, kt\u00f3re wyst\u0119puj\u0105 przed nim. W kontek\u015bcie tym obowi\u0105zuj\u0105 zasady podobne do normalnych metod instancji, z wyj\u0105tkiem, \u017ce kod nie mo\u017ce odnosi\u0107 si\u0119 do tworzonej instancji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Dotychczas w konstruktorach wymagane by\u0142o, aby pierwsz\u0105 instrukcj\u0105 by\u0142 wywo\u0142anie konstruktora klasy nadrz\u0119dnej <code>super(...)<\/code> lub innego konstruktora tej samej klasy <code>this(...)<\/code>. To ograniczenie utrudnia\u0142o wstawienie logiki potrzebnej do stworzenia argument\u00f3w dla <code>super<\/code>, kt\u00f3ra musia\u0142a by\u0107 umieszczana w statycznych metodach pomocniczych, po\u015brednich konstruktorach pomocniczych lub argumentach konstruktora.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Dotychczas w konstruktorach wymagane by\u0142o, aby pierwsz\u0105 instrukcj\u0105 by\u0142 wywo\u0142anie konstruktora klasy nadrz\u0119dnej <code>super(...)<\/code> lub innego konstruktora tej samej klasy <code>this(...)<\/code>. To ograniczenie utrudnia\u0142o wstawienie logiki potrzebnej do stworzenia argument\u00f3w dla <code>super<\/code>, kt\u00f3ra musia\u0142a by\u0107 umieszczana w statycznych metodach pomocniczych, po\u015brednich konstruktorach pomocniczych lub argumentach konstruktora.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 447 wprowadza zmian\u0119 w \u201cgramatyce\u201d konstruktor\u00f3w, pozwalaj\u0105c na umieszczenie instrukcji, kt\u00f3re nie odnosz\u0105 si\u0119 do tworzonej instancji, przed wyra\u017anym wywo\u0142aniem konstruktora. Celem jest zapewnienie wi\u0119kszej swobody w wyra\u017caniu zachowania konstruktor\u00f3w, jednocze\u015bnie zachowuj\u0105c gwarancj\u0119, \u017ce konstruktory dzia\u0142aj\u0105 \u201cod g\u00f3ry do do\u0142u\u201d podczas tworzenia instancji klasy.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 447 wprowadza zmian\u0119 w \u201cgramatyce\u201d konstruktor\u00f3w, pozwalaj\u0105c na umieszczenie instrukcji, kt\u00f3re nie odnosz\u0105 si\u0119 do tworzonej instancji, przed wyra\u017anym wywo\u0142aniem konstruktora. Celem jest zapewnienie wi\u0119kszej swobody w wyra\u017caniu zachowania konstruktor\u00f3w, jednocze\u015bnie zachowuj\u0105c gwarancj\u0119, \u017ce konstruktory dzia\u0142aj\u0105 \u201cod g\u00f3ry do do\u0142u\u201d podczas tworzenia instancji klasy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>W praktyce:<\/strong><\/p>\n","innerContent":["\n<p><strong>W praktyce:<\/strong><\/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>class SubClass extends SuperClass {\n   SubClass(int param) {\n     \/\/ Logika przed konstruktorem klasy nadrz\u0119dnej\n    int calculatedValue = someStaticMethod(param);\n    super(calculatedValue); \/\/ Wywo\u0142anie konstruktora klasy nadrz\u0119dnej\n\n    \/\/ Dodatkowa logika po wywo\u0142aniu super(...)\n   }\n\n   private static int someStaticMethod(int param) {\n      return param * 2;\n }}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class SubClass extends SuperClass {\n   SubClass(int param) {\n     \/\/ Logika przed konstruktorem klasy nadrz\u0119dnej\n    int calculatedValue = someStaticMethod(param);\n    super(calculatedValue); \/\/ Wywo\u0142anie konstruktora klasy nadrz\u0119dnej\n\n    \/\/ Dodatkowa logika po wywo\u0142aniu super(...)\n   }\n\n   private static int someStaticMethod(int param) {\n      return param * 2;\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:\/\/openjdk.org\/jeps\/457\">JEP 457: Class-File API (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/457\">JEP 457: Class-File API (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17260,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.jpeg\" alt=\"\" class=\"wp-image-17260\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.jpeg\" alt=\"\" class=\"wp-image-17260\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Celem JEP 457 jest dostarczy\u0107 standardowe API do parsowania, generowania i transformowania plik\u00f3w klas Java<\/p>\n","innerContent":["\n<p>Celem JEP 457 jest dostarczy\u0107 standardowe API do parsowania, generowania i transformowania plik\u00f3w klas Java<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> W ekosystemie Javy, pliki klasy s\u0105 kluczowe do parsowania, generowania i transformacji. Istniej\u0105ce biblioteki do przetwarzania plik\u00f3w klasy, takie jak <strong>ASM<\/strong>, <strong>BCEL<\/strong> czy <strong>Javassist<\/strong>, nie zawsze nad\u0105\u017caj\u0105 za szybkimi zmianami formatu plik\u00f3w klasy wprowadzanymi w JDK. To prowadzi do problem\u00f3w z niezgodno\u015bci\u0105 wersji i b\u0142\u0119d\u00f3w widocznych dla programist\u00f3w aplikacji.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> W ekosystemie Javy, pliki klasy s\u0105 kluczowe do parsowania, generowania i transformacji. Istniej\u0105ce biblioteki do przetwarzania plik\u00f3w klasy, takie jak <strong>ASM<\/strong>, <strong>BCEL<\/strong> czy <strong>Javassist<\/strong>, nie zawsze nad\u0105\u017caj\u0105 za szybkimi zmianami formatu plik\u00f3w klasy wprowadzanymi w JDK. To prowadzi do problem\u00f3w z niezgodno\u015bci\u0105 wersji i b\u0142\u0119d\u00f3w widocznych dla programist\u00f3w aplikacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 457 proponuje standardowe API do parsowania, generowania i transformacji plik\u00f3w klasy Java, kt\u00f3re b\u0119dzie \u015bledzi\u0107 format pliku <code>class<\/code> zdefiniowany przez Specyfikacj\u0119 JVM. To umo\u017cliwi migracj\u0119 komponent\u00f3w JDK w\u0142a\u015bnie na nie, ostatecznie eliminuj\u0105c potrzeb\u0119 u\u017cywania wewn\u0119trznej kopii biblioteki ASM w JDK.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 457 proponuje standardowe API do parsowania, generowania i transformacji plik\u00f3w klasy Java, kt\u00f3re b\u0119dzie \u015bledzi\u0107 format pliku <code>class<\/code> zdefiniowany przez Specyfikacj\u0119 JVM. To umo\u017cliwi migracj\u0119 komponent\u00f3w JDK w\u0142a\u015bnie na nie, ostatecznie eliminuj\u0105c potrzeb\u0119 u\u017cywania wewn\u0119trznej kopii biblioteki ASM w JDK.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlaczego teraz? Tw\u00f3rcy przekonuj\u0105, \u017ce ewolucja JVMa znacznie przyspieszy\u0142a i coraz wi\u0119cej zmian odbywa si\u0119 w\u0142a\u015bnie na poziomie generowanego kodu. Dzi\u0119ki nowemu API du\u017ce inicjatywy jak np. Valhalla ma by\u0107 mniej uci\u0105\u017cliwe dla ca\u0142ego ekosystemu.<\/p>\n","innerContent":["\n<p>Dlaczego teraz? Tw\u00f3rcy przekonuj\u0105, \u017ce ewolucja JVMa znacznie przyspieszy\u0142a i coraz wi\u0119cej zmian odbywa si\u0119 w\u0142a\u015bnie na poziomie generowanego kodu. Dzi\u0119ki nowemu API du\u017ce inicjatywy jak np. Valhalla ma by\u0107 mniej uci\u0105\u017cliwe dla ca\u0142ego ekosystemu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad parsowania plik\u00f3w klasy z wzorcami:<\/strong><br><code><br> CodeModel code = ...<br> Set&lt;ClassDesc&gt; deps = new HashSet&lt;&gt;();<br> for (CodeElement e : code) {<br>     switch (e) {<br>         case FieldInstruction f  -&gt; deps.add(f.owner());<br>         case InvokeInstruction i -&gt; deps.add(i.owner());<br>         \/\/ ... i tak dalej dla instanceof, cast, itd.<br>     }<br> }<br> <\/code><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad parsowania plik\u00f3w klasy z wzorcami:<\/strong><br><code><br> CodeModel code = ...<br> Set&lt;ClassDesc&gt; deps = new HashSet&lt;&gt;();<br> for (CodeElement e : code) {<br>     switch (e) {<br>         case FieldInstruction f  -&gt; deps.add(f.owner());<br>         case InvokeInstruction i -&gt; deps.add(i.owner());<br>         \/\/ ... i tak dalej dla instanceof, cast, itd.<br>     }<br> }<br> <\/code><\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/459\">JEP 459: String Templates (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/459\">JEP 459: String Templates (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17262,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1.jpeg\" alt=\"\" class=\"wp-image-17262\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-1.jpeg\" alt=\"\" class=\"wp-image-17262\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 459 wprowadza \u201cszablony tekstowe\u201d jako nowy rodzaj wyra\u017cenia w Javie. Szablony tekstowe u\u0142atwiaj\u0105 tworzenie d\u0142ugich ci\u0105g\u00f3w znak\u00f3w, \u0142\u0105cz\u0105c zhardcodowany tekst z osadzonymi wyra\u017ceniami i procesorami szablon\u00f3w, w celu uzyskania specjalizowanych wynik\u00f3w.<\/p>\n","innerContent":["\n<p>JEP 459 wprowadza \u201cszablony tekstowe\u201d jako nowy rodzaj wyra\u017cenia w Javie. Szablony tekstowe u\u0142atwiaj\u0105 tworzenie d\u0142ugich ci\u0105g\u00f3w znak\u00f3w, \u0142\u0105cz\u0105c zhardcodowany tekst z osadzonymi wyra\u017ceniami i procesorami szablon\u00f3w, w celu uzyskania specjalizowanych wynik\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Programi\u015bci Java rutynowo tworz\u0105 ci\u0105gi znak\u00f3w, \u0142\u0105cz\u0105c tekst sta\u0142y z wyra\u017ceniami. Istniej\u0105ce metody sk\u0142adania ci\u0105g\u00f3w w Javie, takie jak konkatenacja za pomoc\u0105 operatora +, s\u0105 niewygodne i mog\u0105 prowadzi\u0107 do trudnego w utrzymaniu kodu.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Programi\u015bci Java rutynowo tworz\u0105 ci\u0105gi znak\u00f3w, \u0142\u0105cz\u0105c tekst sta\u0142y z wyra\u017ceniami. Istniej\u0105ce metody sk\u0142adania ci\u0105g\u00f3w w Javie, takie jak konkatenacja za pomoc\u0105 operatora +, s\u0105 niewygodne i mog\u0105 prowadzi\u0107 do trudnego w utrzymaniu kodu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong><br>String Templates to nowy rodzaj konstruktu w Java, kt\u00f3re umo\u017cliwiaj\u0105 interpolacj\u0119 ci\u0105g\u00f3w znak\u00f3w, ale w spos\u00f3b bardziej zaawansowany ni\u017c istniej\u0105ce rozwi\u0105zania. String Templates zapewniaj\u0105 bezpiecznie i efektywnie komponowa\u0107 ci\u0105gi znak\u00f3w.<br>Przyk\u0142adowo, procesor szablonu STR wykonuje interpolacj\u0119 ci\u0105g\u00f3w znak\u00f3w, zast\u0119puj\u0105c ka\u017cde osadzone wyra\u017cenie w szablonie jego (sformatowan\u0105) warto\u015bci\u0105.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong><br>String Templates to nowy rodzaj konstruktu w Java, kt\u00f3re umo\u017cliwiaj\u0105 interpolacj\u0119 ci\u0105g\u00f3w znak\u00f3w, ale w spos\u00f3b bardziej zaawansowany ni\u017c istniej\u0105ce rozwi\u0105zania. String Templates zapewniaj\u0105 bezpiecznie i efektywnie komponowa\u0107 ci\u0105gi znak\u00f3w.<br>Przyk\u0142adowo, procesor szablonu STR wykonuje interpolacj\u0119 ci\u0105g\u00f3w znak\u00f3w, zast\u0119puj\u0105c ka\u017cde osadzone wyra\u017cenie w szablonie jego (sformatowan\u0105) warto\u015bci\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad kodu:<\/strong><br><code><br>\nString name = \"Joan\";<br>\nString info = STR.\"My name is \\{name}\";<br>\nassert info.equals(\"My name is Joan\");   \/\/ true<br>\n<\/code><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad kodu:<\/strong><br><code><br>\nString name = \"Joan\";<br>\nString info = STR.\"My name is \\{name}\";<br>\nassert info.equals(\"My name is Joan\");   \/\/ true<br>\n<\/code><\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/461\">JEP 461: Stream Gatherers (Preview) <\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/461\">JEP 461: Stream Gatherers (Preview) <\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17277,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8.jpeg\" alt=\"\" class=\"wp-image-17277\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-8.jpeg\" alt=\"\" class=\"wp-image-17277\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Interfejs Stream Gatherer reprezentuje transformacj\u0119 element\u00f3w Streamu. Gatherers mog\u0105 transformowa\u0107 elementy w r\u00f3\u017cnorodny spos\u00f3b: jeden do jednego, jeden do wielu, wiele do jednego, wiele do wielu. Mog\u0105 te\u017c \u015bledzi\u0107 wcze\u015bniej widziane elementy, aby wp\u0142yn\u0105\u0107 na transformacj\u0119 p\u00f3\u017aniejszych element\u00f3w, a tak\u017ce przerwa\u0107 przetwarzanie, aby przekszta\u0142ci\u0107 niesko\u0144czone strumienie na sko\u0144czone, umo\u017cliwiaj\u0105c ich zr\u00f3wnoleglone wykonanie.<\/p>\n","innerContent":["\n<p>Interfejs Stream Gatherer reprezentuje transformacj\u0119 element\u00f3w Streamu. Gatherers mog\u0105 transformowa\u0107 elementy w r\u00f3\u017cnorodny spos\u00f3b: jeden do jednego, jeden do wielu, wiele do jednego, wiele do wielu. Mog\u0105 te\u017c \u015bledzi\u0107 wcze\u015bniej widziane elementy, aby wp\u0142yn\u0105\u0107 na transformacj\u0119 p\u00f3\u017aniejszych element\u00f3w, a tak\u017ce przerwa\u0107 przetwarzanie, aby przekszta\u0142ci\u0107 niesko\u0144czone strumienie na sko\u0144czone, umo\u017cliwiaj\u0105c ich zr\u00f3wnoleglone wykonanie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki problem rozwi\u0105zuj\u0105?:<\/strong> Chocia\u017c Stream API od czasu JDK 1.8 zapewnia bogaty zestaw operacji po\u015brednich i ko\u0144cowych, takich jak mapowanie, filtrowanie, redukcja czy sortowanie, nie posiada\u0142o mo\u017cliwo\u015bci rozszerzenia tego zestawu. To oznacza, \u017ce niekt\u00f3re z\u0142o\u017cone zadania nie mog\u0105 by\u0107 \u0142atwo wyra\u017cone jako streamy, poniewa\u017c niezb\u0119dna operacja po\u015brednia nie istnia\u0142a.<\/p>\n","innerContent":["\n<p><strong>Jaki problem rozwi\u0105zuj\u0105?:<\/strong> Chocia\u017c Stream API od czasu JDK 1.8 zapewnia bogaty zestaw operacji po\u015brednich i ko\u0144cowych, takich jak mapowanie, filtrowanie, redukcja czy sortowanie, nie posiada\u0142o mo\u017cliwo\u015bci rozszerzenia tego zestawu. To oznacza, \u017ce niekt\u00f3re z\u0142o\u017cone zadania nie mog\u0105 by\u0107 \u0142atwo wyra\u017cone jako streamy, poniewa\u017c niezb\u0119dna operacja po\u015brednia nie istnia\u0142a.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Co przynosi JEP:<\/strong> JEP 461 wprowadza operacj\u0119 po\u015bredni\u0105 <code>Stream::gather(Gatherer)<\/code> do Stream API, umo\u017cliwiaj\u0105c\u0105 przetwarzanie element\u00f3w strumienia za pomoc\u0105 zdefiniowanego przez u\u017cytkownika zbioru operacji zwanych \"gathererami\u201d. Pozwala to na rozszerzenie mo\u017cliwo\u015bci Stream API, kt\u00f3re teraz odwzorowa\u0107 mog\u0105 prawie ka\u017cd\u0105 operacj\u0119 po\u015bredni\u0105.<\/p>\n","innerContent":["\n<p><strong>Co przynosi JEP:<\/strong> JEP 461 wprowadza operacj\u0119 po\u015bredni\u0105 <code>Stream::gather(Gatherer)<\/code> do Stream API, umo\u017cliwiaj\u0105c\u0105 przetwarzanie element\u00f3w strumienia za pomoc\u0105 zdefiniowanego przez u\u017cytkownika zbioru operacji zwanych \"gathererami\u201d. Pozwala to na rozszerzenie mo\u017cliwo\u015bci Stream API, kt\u00f3re teraz odwzorowa\u0107 mog\u0105 prawie ka\u017cd\u0105 operacj\u0119 po\u015bredni\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad kodu:<\/strong><br>Za\u0142\u00f3\u017cmy, \u017ce zadanie polega na wzi\u0119ciu strumienia ci\u0105g\u00f3w znak\u00f3w i uczynieniu go unikalnym, ale z unikalno\u015bci\u0105 opart\u0105 na d\u0142ugo\u015bci ci\u0105gu, a nie na jego zawarto\u015bci:<\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad kodu:<\/strong><br>Za\u0142\u00f3\u017cmy, \u017ce zadanie polega na wzi\u0119ciu strumienia ci\u0105g\u00f3w znak\u00f3w i uczynieniu go unikalnym, ale z unikalno\u015bci\u0105 opart\u0105 na d\u0142ugo\u015bci ci\u0105gu, a nie na jego zawarto\u015bci:<\/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>var result = Stream.of(\"foo\", \"bar\", \"baz\", \"quux\")\n        .gather(new DistinctByLengthGatherer())\n        .toList();                   \n\npublic class DistinctByLengthGatherer implements Gatherer&lt;String, String, Set&lt;Integer&gt;, List&lt;String&gt;&gt; {\n    @Override\n    public Supplier&lt;Set&lt;Integer&gt;&gt; supplier() {\n        return HashSet::new;\n    }\n\n    @Override\n    public BiConsumer&lt;Set&lt;Integer&gt;, String&gt; accumulator() {\n        return (seen, string) -&gt; {\n            if (seen.add(string.length())) {\n                seen.add(string);\n            }\n        };\n    }\n\n    @Override\n    public BinaryOperator&lt;Set&lt;Integer&gt;&gt; combiner() {\n        return (seen1, seen2) -&gt; {\n            seen1.addAll(seen2);\n            return seen1;\n        };\n    }\n\n    @Override\n    public Function&lt;Set&lt;Integer&gt;, List&lt;String&gt;&gt; finisher() {\n        return ArrayList::new;\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>var result = Stream.of(\"foo\", \"bar\", \"baz\", \"quux\")\n        .gather(new DistinctByLengthGatherer())\n        .toList();                   \n\npublic class DistinctByLengthGatherer implements Gatherer&lt;String, String, Set&lt;Integer&gt;, List&lt;String&gt;&gt; {\n    @Override\n    public Supplier&lt;Set&lt;Integer&gt;&gt; supplier() {\n        return HashSet::new;\n    }\n\n    @Override\n    public BiConsumer&lt;Set&lt;Integer&gt;, String&gt; accumulator() {\n        return (seen, string) -&gt; {\n            if (seen.add(string.length())) {\n                seen.add(string);\n            }\n        };\n    }\n\n    @Override\n    public BinaryOperator&lt;Set&lt;Integer&gt;&gt; combiner() {\n        return (seen1, seen2) -&gt; {\n            seen1.addAll(seen2);\n            return seen1;\n        };\n    }\n\n    @Override\n    public Function&lt;Set&lt;Integer&gt;, List&lt;String&gt;&gt; finisher() {\n        return ArrayList::new;\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W tym przyk\u0142adzie, hipotetyczna operacja <code>.gather(new DistinctByLengthGatherer())<\/code> jest przyk\u0142adem zastosowania Gatherera.<\/p>\n","innerContent":["\n<p>W tym przyk\u0142adzie, hipotetyczna operacja <code>.gather(new DistinctByLengthGatherer())<\/code> jest przyk\u0142adem zastosowania Gatherera.<\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/462\">JEP 462: Structured Concurrency (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/462\">JEP 462: Structured Concurrency (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17280,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9.jpeg\" alt=\"\" class=\"wp-image-17280\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-9.jpeg\" alt=\"\" class=\"wp-image-17280\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 462 wprowadza API dla strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, co u\u0142atwia zarz\u0105dzanie grupami powi\u0105zanych zada\u0144 dzia\u0142aj\u0105cych w r\u00f3\u017cnych w\u0105tkach jako pojedyncz\u0105 jednostk\u0119 pracy. To podej\u015bcie upraszcza obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i anulowanie, poprawiaj\u0105c niezawodno\u015b\u0107 i obserwowalno\u015b\u0107.<\/p>\n","innerContent":["\n<p>JEP 462 wprowadza API dla strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, co u\u0142atwia zarz\u0105dzanie grupami powi\u0105zanych zada\u0144 dzia\u0142aj\u0105cych w r\u00f3\u017cnych w\u0105tkach jako pojedyncz\u0105 jednostk\u0119 pracy. To podej\u015bcie upraszcza obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i anulowanie, poprawiaj\u0105c niezawodno\u015b\u0107 i obserwowalno\u015b\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Programowanie wsp\u00f3\u0142bie\u017cne mo\u017ce by\u0107 skomplikowane, szczeg\u00f3lnie przy zarz\u0105dzaniu wieloma zadaniami wykonywanymi r\u00f3wnolegle. Istniej\u0105ce podej\u015bcia cz\u0119sto wi\u0105\u017c\u0105 si\u0119 z ryzykiem wyciek\u00f3w w\u0105tk\u00f3w, op\u00f3\u017anie\u0144 w anulowaniu, a tak\u017ce problemami z obserwowalno\u015bci\u0105 kodu wsp\u00f3\u0142bie\u017cnego.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Programowanie wsp\u00f3\u0142bie\u017cne mo\u017ce by\u0107 skomplikowane, szczeg\u00f3lnie przy zarz\u0105dzaniu wieloma zadaniami wykonywanymi r\u00f3wnolegle. Istniej\u0105ce podej\u015bcia cz\u0119sto wi\u0105\u017c\u0105 si\u0119 z ryzykiem wyciek\u00f3w w\u0105tk\u00f3w, op\u00f3\u017anie\u0144 w anulowaniu, a tak\u017ce problemami z obserwowalno\u015bci\u0105 kodu wsp\u00f3\u0142bie\u017cnego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong><br>Kluczow\u0105 klas\u0105 API strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci jest <code>StructuredTaskScope<\/code> z pakietu <code>java.util.concurrent<\/code>. Pozwala ona strukturyzowa\u0107 zadanie jako grup\u0105 wsp\u00f3\u0142bie\u017cnych podzada\u0144 i koordynowa\u0107 ich jako jednostki w ramach konkretnej struktury. Podzadania s\u0105 wykonywane w w\u0142asnych w\u0105tkach, a nast\u0119pnie zarz\u0105dzanie, \u0142\u0105czone i anulowane, w tym anulowane kaskadowo.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong><br>Kluczow\u0105 klas\u0105 API strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci jest <code>StructuredTaskScope<\/code> z pakietu <code>java.util.concurrent<\/code>. Pozwala ona strukturyzowa\u0107 zadanie jako grup\u0105 wsp\u00f3\u0142bie\u017cnych podzada\u0144 i koordynowa\u0107 ich jako jednostki w ramach konkretnej struktury. Podzadania s\u0105 wykonywane w w\u0142asnych w\u0105tkach, a nast\u0119pnie zarz\u0105dzanie, \u0142\u0105czone i anulowane, w tym anulowane kaskadowo.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad u\u017cycia:<\/strong><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad u\u017cycia:<\/strong><\/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>Response handle() throws ExecutionException, InterruptedException {\n  try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n    Supplier user = scope.fork(() -&gt; findUser());\n    Supplier order = scope.fork(() -&gt; fetchOrder());\n    scope.join()            \n         .throwIfFailed(); \n\n    return new Response(user.get(), order.get());\n  }\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Response handle() throws ExecutionException, InterruptedException {\n  try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n    Supplier user = scope.fork(() -&gt; findUser());\n    Supplier order = scope.fork(() -&gt; fetchOrder());\n    scope.join()            \n         .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":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/463\">JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/463\">JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17274,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7.jpeg\" alt=\"\" class=\"wp-image-17274\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-7.jpeg\" alt=\"\" class=\"wp-image-17274\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadza mo\u017cliwo\u015b\u0107 pisania metody <code>main<\/code> bezpo\u015brednio na poziomie pliku \u017ar\u00f3d\u0142owego, bez konieczno\u015bci umieszczania ich w klasie, co upraszcza struktur\u0119 kodu, szczeg\u00f3lnie dla pocz\u0105tkuj\u0105cych.<\/p>\n","innerContent":["\n<p>Wprowadza mo\u017cliwo\u015b\u0107 pisania metody <code>main<\/code> bezpo\u015brednio na poziomie pliku \u017ar\u00f3d\u0142owego, bez konieczno\u015bci umieszczania ich w klasie, co upraszcza struktur\u0119 kodu, szczeg\u00f3lnie dla pocz\u0105tkuj\u0105cych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Java, b\u0119d\u0105c dobrym narz\u0119dziem do tworzenia du\u017cych, z\u0142o\u017conych aplikacji, mo\u017ce by\u0107 wyzwaniem dla pocz\u0105tkuj\u0105cych programist\u00f3w, zw\u0142aszcza w por\u00f3wnaniu z takim Pythonem. Pierwsze kroki w nauce Javy cz\u0119sto wi\u0105\u017c\u0105 si\u0119 z konieczno\u015bci\u0105 zrozumienia i stosowania skomplikowanych koncept\u00f3w, kt\u00f3re s\u0105 niepotrzebne przy pisaniu prostych program\u00f3w.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Java, b\u0119d\u0105c dobrym narz\u0119dziem do tworzenia du\u017cych, z\u0142o\u017conych aplikacji, mo\u017ce by\u0107 wyzwaniem dla pocz\u0105tkuj\u0105cych programist\u00f3w, zw\u0142aszcza w por\u00f3wnaniu z takim Pythonem. Pierwsze kroki w nauce Javy cz\u0119sto wi\u0105\u017c\u0105 si\u0119 z konieczno\u015bci\u0105 zrozumienia i stosowania skomplikowanych koncept\u00f3w, kt\u00f3re s\u0105 niepotrzebne przy pisaniu prostych program\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 463 wprowadza do Javy niejawnie deklarowane klasy i metody main dla instancji, co u\u0142atwia pisanie prostych program\u00f3w. Pozwala to na bardziej intuicyjne i mniej obci\u0105\u017caj\u0105ce podej\u015bcie do tworzenia pocz\u0105tkowych program\u00f3w, jednocze\u015bnie zachowuj\u0105c pe\u0142n\u0105 kompatybilno\u015b\u0107 i mo\u017cliwo\u015b\u0107 rozszerzenia do bardziej zaawansowanych funkcji j\u0119zyka, gdy umiej\u0119tno\u015bci programisty rosn\u0105.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> JEP 463 wprowadza do Javy niejawnie deklarowane klasy i metody main dla instancji, co u\u0142atwia pisanie prostych program\u00f3w. Pozwala to na bardziej intuicyjne i mniej obci\u0105\u017caj\u0105ce podej\u015bcie do tworzenia pocz\u0105tkowych program\u00f3w, jednocze\u015bnie zachowuj\u0105c pe\u0142n\u0105 kompatybilno\u015b\u0107 i mo\u017cliwo\u015b\u0107 rozszerzenia do bardziej zaawansowanych funkcji j\u0119zyka, gdy umiej\u0119tno\u015bci programisty rosn\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad w praktyce:<\/strong><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad w praktyce:<\/strong><\/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}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>void main() {\n    System.out.println(\"Hello, World!\");\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ten przyk\u0142ad pokazuje, jak za pomoc\u0105 uproszczonej struktury mo\u017cna napisa\u0107 program wypisuj\u0105cy \"Hello, World!\" bez konieczno\u015bci jawnego deklarowania klasy i statycznej metody main.<\/p>\n","innerContent":["\n<p>Ten przyk\u0142ad pokazuje, jak za pomoc\u0105 uproszczonej struktury mo\u017cna napisa\u0107 program wypisuj\u0105cy \"Hello, World!\" bez konieczno\u015bci jawnego deklarowania klasy i statycznej metody main.<\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/464\">JEP 464: Scoped Values (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/464\">JEP 464: Scoped Values (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17282,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10.jpeg\" alt=\"\" class=\"wp-image-17282\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-10.jpeg\" alt=\"\" class=\"wp-image-17282\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 464 wprowadza \"scoped values\", kt\u00f3re umo\u017cliwiaj\u0105 bezpieczne i wydajne przekazywanie \u201cuwi\u0119zionych\u201d w konkretnym scope, niemutowalnych danych w obr\u0119bie pojedynczego w\u0105tku, a tak\u017ce mi\u0119dzy nimi. Stanowi\u0105 one preferowan\u0105 alternatyw\u0119 dla <code>Thread.Local<\/code>, szczeg\u00f3lnie przy u\u017cyciu du\u017cej liczby wirtualnych w\u0105tk\u00f3w.<\/p>\n","innerContent":["\n<p>JEP 464 wprowadza \"scoped values\", kt\u00f3re umo\u017cliwiaj\u0105 bezpieczne i wydajne przekazywanie \u201cuwi\u0119zionych\u201d w konkretnym scope, niemutowalnych danych w obr\u0119bie pojedynczego w\u0105tku, a tak\u017ce mi\u0119dzy nimi. Stanowi\u0105 one preferowan\u0105 alternatyw\u0119 dla <code>Thread.Local<\/code>, szczeg\u00f3lnie przy u\u017cyciu du\u017cej liczby wirtualnych w\u0105tk\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> W Java, metody cz\u0119sto wymagaj\u0105 przekazywania danych jako parametr\u00f3w, co mo\u017ce by\u0107 niepraktyczne, gdy ka\u017cdy po\u015bredni wywo\u0142ywany potrzebuje r\u00f3\u017cnych danych. Cz\u0119sto tworzony jest wi\u0119c mutowany kontekst, kt\u00f3ry jest swoistym \u201cworkiem na dane\u201d, przekazywanym za pomoc\u0105 parametr\u00f3w lub trzymany w pami\u0119ci w\u0105tku\u201d<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> W Java, metody cz\u0119sto wymagaj\u0105 przekazywania danych jako parametr\u00f3w, co mo\u017ce by\u0107 niepraktyczne, gdy ka\u017cdy po\u015bredni wywo\u0142ywany potrzebuje r\u00f3\u017cnych danych. Cz\u0119sto tworzony jest wi\u0119c mutowany kontekst, kt\u00f3ry jest swoistym \u201cworkiem na dane\u201d, przekazywanym za pomoc\u0105 parametr\u00f3w lub trzymany w pami\u0119ci w\u0105tku\u201d<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> \"Scoped values\" pozwalaj\u0105 na udost\u0119pnianie danych mi\u0119dzy metodami w du\u017cym programie bez u\u017cycia parametr\u00f3w metod. S\u0105 one typu <code>ScopedValue<\/code> i zwykle deklarowane jako <code>final static<\/code> z prywatnym dost\u0119pem, aby zapobiec bezpo\u015bredniemu dost\u0119powi z innych klas.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> \"Scoped values\" pozwalaj\u0105 na udost\u0119pnianie danych mi\u0119dzy metodami w du\u017cym programie bez u\u017cycia parametr\u00f3w metod. S\u0105 one typu <code>ScopedValue<\/code> i zwykle deklarowane jako <code>final static<\/code> z prywatnym dost\u0119pem, aby zapobiec bezpo\u015bredniemu dost\u0119powi z innych klas.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17258},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.png\" alt=\"\" class=\"wp-image-17258\"\/><figcaption class=\"wp-element-caption\">Pomys\u0142 wykonania tego zadania zosta\u0142 zaczerpni\u0119ty z Common Lispa i jego \"zmiennych specjalnych\"<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image.png\" alt=\"\" class=\"wp-image-17258\"\/><figcaption class=\"wp-element-caption\">Pomys\u0142 wykonania tego zadania zosta\u0142 zaczerpni\u0119ty z Common Lispa i jego \"zmiennych specjalnych\"<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad u\u017cycia:<\/strong><code><br>ScopedValue.where(NAME, &lt;value&gt;)<br>      .run(() -&gt; { ... NAME.get() ... call methods ... });<\/code><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad u\u017cycia:<\/strong><code><br>ScopedValue.where(NAME, &lt;value&gt;)<br>      .run(() -&gt; { ... NAME.get() ... call methods ... });<\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W tym przyk\u0142adzie, <code>ScopedValue.where<\/code> definiuje scoped value i obiekt, do kt\u00f3rego ma by\u0107 zwi\u0105zany. Wywo\u0142anie <code>run<\/code> wi\u0105\u017ce scoped value, dostarczaj\u0105c kopi\u0119 specyficzn\u0105 dla bie\u017c\u0105cego w\u0105tku, a nast\u0119pnie wykonuje przekazane wyra\u017cenie lambda. Podczas trwania wywo\u0142ania <code>run<\/code>, wyra\u017cenie lambda lub ka\u017cda metoda wywo\u0142ana bezpo\u015brednio lub po\u015brednio z tego wyra\u017cenia, mo\u017ce odczyta\u0107 scoped value za pomoc\u0105 metody <code>get()<\/code>.<\/p>\n","innerContent":["\n<p>W tym przyk\u0142adzie, <code>ScopedValue.where<\/code> definiuje scoped value i obiekt, do kt\u00f3rego ma by\u0107 zwi\u0105zany. Wywo\u0142anie <code>run<\/code> wi\u0105\u017ce scoped value, dostarczaj\u0105c kopi\u0119 specyficzn\u0105 dla bie\u017c\u0105cego w\u0105tku, a nast\u0119pnie wykonuje przekazane wyra\u017cenie lambda. Podczas trwania wywo\u0142ania <code>run<\/code>, wyra\u017cenie lambda lub ka\u017cda metoda wywo\u0142ana bezpo\u015brednio lub po\u015brednio z tego wyra\u017cenia, mo\u017ce odczyta\u0107 scoped value za pomoc\u0105 metody <code>get()<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Inkubacja<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Inkubacja<\/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\"><a href=\"https:\/\/openjdk.org\/jeps\/464\">JEP 460: Vector API (Seventh Incubator)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/464\">JEP 460: Vector API (Seventh Incubator)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17284,"scale":"cover"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11.jpeg\" alt=\"\" class=\"wp-image-17284\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/12\/image-11.jpeg\" alt=\"\" class=\"wp-image-17284\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Kr\u00f3tki opis:<\/strong> JEP 460 rozwija API umo\u017cliwiaj\u0105ce wyra\u017cenie oblicze\u0144 wektorowych, kompiluj\u0105cych si\u0119 do natywnych instrukcji wektorowych na obs\u0142ugiwanych architekturach CPU, zapewniaj\u0105c wydajno\u015b\u0107 przewy\u017cszaj\u0105c\u0105 r\u00f3wnowa\u017cne obliczenia skalarne.<\/p>\n","innerContent":["\n<p><strong>Kr\u00f3tki opis:<\/strong> JEP 460 rozwija API umo\u017cliwiaj\u0105ce wyra\u017cenie oblicze\u0144 wektorowych, kompiluj\u0105cych si\u0119 do natywnych instrukcji wektorowych na obs\u0142ugiwanych architekturach CPU, zapewniaj\u0105c wydajno\u015b\u0107 przewy\u017cszaj\u0105c\u0105 r\u00f3wnowa\u017cne obliczenia skalarne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Pierwotny problem:<\/strong> Obliczenia wektorowe, kt\u00f3re pozwalaj\u0105 na r\u00f3wnoczesne wykonywanie operacji na wielu danych, by\u0142y trudne do wyra\u017cenia w Javie i zale\u017ca\u0142y od algorytmu auto-wektoryzacji HotSpot, co ogranicza\u0142o ich u\u017cyteczno\u015b\u0107 i wydajno\u015b\u0107 w praktyce.<\/p>\n","innerContent":["\n<p><strong>Pierwotny problem:<\/strong> Obliczenia wektorowe, kt\u00f3re pozwalaj\u0105 na r\u00f3wnoczesne wykonywanie operacji na wielu danych, by\u0142y trudne do wyra\u017cenia w Javie i zale\u017ca\u0142y od algorytmu auto-wektoryzacji HotSpot, co ogranicza\u0142o ich u\u017cyteczno\u015b\u0107 i wydajno\u015b\u0107 w praktyce.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zanie:<\/strong> Vector API w Javie umo\u017cliwia tworzenie z\u0142o\u017conych algorytm\u00f3w wektorowych z wi\u0119ksz\u0105 przewidywalno\u015bci\u0105 i niezawodno\u015bci\u0105, z wykorzystaniem istniej\u0105cego auto-wektoryzatora HotSpot, ale z bardziej przewidywalnym modelem dla u\u017cytkownika.<\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zanie:<\/strong> Vector API w Javie umo\u017cliwia tworzenie z\u0142o\u017conych algorytm\u00f3w wektorowych z wi\u0119ksz\u0105 przewidywalno\u015bci\u0105 i niezawodno\u015bci\u0105, z wykorzystaniem istniej\u0105cego auto-wektoryzatora HotSpot, ale z bardziej przewidywalnym modelem dla u\u017cytkownika.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Co si\u0119 zmieni\u0142o od poprzedniego inkubatora:<\/strong> W JDK 22, API zosta\u0142o ponownie wprowadzone do inkubacji z drobnymi usprawnieniami w stosunku do JDK 21, w tym poprawkami b\u0142\u0119d\u00f3w i usprawnieniami wydajno\u015bci. Dalej czeka ono na finalizacje prac nad Project Valhalla.<\/p>\n","innerContent":["\n<p><strong>Co si\u0119 zmieni\u0142o od poprzedniego inkubatora:<\/strong> W JDK 22, API zosta\u0142o ponownie wprowadzone do inkubacji z drobnymi usprawnieniami w stosunku do JDK 21, w tym poprawkami b\u0142\u0119d\u00f3w i usprawnieniami wydajno\u015bci. Dalej czeka ono na finalizacje prac nad Project Valhalla.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17250","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=17250"}],"version-history":[{"count":16,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17250\/revisions"}],"predecessor-version":[{"id":17313,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17250\/revisions\/17313"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/17253"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=17250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=17250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=17250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}