{"id":18200,"date":"2024-06-07T12:48:20","date_gmt":"2024-06-07T10:48:20","guid":{"rendered":"https:\/\/vived.io\/?p=18200"},"modified":"2024-06-07T12:49:28","modified_gmt":"2024-06-07T10:49:28","slug":"feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/","title":{"rendered":"Feature Freeze dla JDK 23: Co przyniesie nowa edycja? &#8211; JVM Weekly vol. 174"},"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\/467\">467: Markdown Documentation Comments<\/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\/2024\/06\/image-1024x585.png\" alt=\"\" class=\"wp-image-18202\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><a href=\"https:\/\/openjdk.org\/jeps\/467\">JEP 467<\/a> wprowadza mo\u017cliwo\u015b\u0107 pisania komentarzy dokumentacyjnych JavaDoc za pomoc\u0105 Markdown, opr\u00f3cz dotychczasowego formatu HTML i tag\u00f3w JavaDoc. U\u0142atwia to tworzenie i czytanie dokumentacji umieszczanej bezpo\u015brednio w kodzie \u017ar\u00f3d\u0142owym.<\/p>\n\n\n\n<p><strong>Jaki jest problem?:<\/strong> Obecne komentarze dokumentacyjne JavaDoc korzystaj\u0105 z HTML i specyficznych tag\u00f3w JavaDoc, co jest trudne do pisania i czytania. HTML ma to do siebie, \u017ce bardzo &#8222;zanieczyszcza&#8221; tre\u015b\u0107, co zniech\u0119ca programist\u00f3w do tworzenia dobrze sformatowanej dokumentacji. Dodatkowo, tagi do dokumentowania JavaDoc s\u0105 mniej znane i cz\u0119sto wymagaj\u0105 konsultacji z ich w\u0142asn\u0105 dokumentacj\u0105 (co jak na to spojrze\u0107 robi robi si\u0119 nieco meta).<\/p>\n\n\n\n<p><strong>Solution:<\/strong> JEP 467 wprowadza wsparcie dla Markdown w komentarzach dokumentacyjnych, co umo\u017cliwia bardziej zwi\u0119z\u0142e i czytelne formatowanie dokumentacji. Markdown jest obecnie standardem w\u015br\u00f3d j\u0119zyk\u00f3w znacznik\u00f3w u\u017cywanych przez programist\u00f3w, a na jego popularyzacje wp\u0142yn\u0105\u0142 min. GitHub, wi\u0119c sk\u0142adnia po prostu jest szeroko u\u017cywana i znana (ciekawostka &#8211; wszystkie edycje JVM Weekly powstaj\u0105 oryginalnie w\u0142a\u015bnie w Markdownie). Dzi\u0119ki temu programi\u015bci mog\u0105 pisa\u0107 dokumentacj\u0119 szybciej i z mniejszym wysi\u0142kiem, nadal maj\u0105c mo\u017cliwo\u015b\u0107 korzystania z HTML i tag\u00f3w JavaDoc tam, gdzie jest to konieczne (dodatkowo &#8211; wiele popularnych parser\u00f3w Markdown jest kompatybilnych ze wstawkami z HTML).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n\n\n\n<p>Tradycyjny komentarz JavaDoc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Returns a &lt;b&gt;hash code&lt;\/b&gt; value for the object.\n * &lt;p&gt;\n * The general contract of {@code hashCode} is:\n * &lt;ul&gt;\n * &lt;li&gt;Must consistently return the same integer for the same object,\n *     provided no information used in {@code equals} comparisons is modified.\n * &lt;li&gt;If two objects are equal according to the {@link #equals(Object)} method,\n *     calling {@code hashCode} on each must produce the same result.\n * &lt;li&gt;It is not required that unequal objects produce distinct integers,\n *     but this improves the performance of hash tables.\n * &lt;\/ul&gt;\n *\n * @implSpec\n * The {@code hashCode} method defined by class {@code Object} returns distinct\n * integers for distinct objects as far as is practical.\n *\n * @return  a hash code value for this object.\n * @see     java.lang.Object#equals(java.lang.Object)\n * @see     java.lang.System#identityHashCode\n *\/\n<\/code><\/pre>\n\n\n\n<p>Ten sam komentarz Markdown:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\/ Returns a **hash code** value for the object.\n\/\/\/ \n\/\/\/ The general contract of `hashCode` is:\n\/\/\/\n\/\/\/ - Must consistently return the same integer for the same object,\n\/\/\/   provided no information used in `equals` comparisons is modified.\n\/\/\/ - If two objects are equal according to the &#091;equals]&#091;#equals(Object)] method,\n\/\/\/   calling `hashCode` on each must produce the same result.\n\/\/\/ - It is not required that unequal objects produce distinct integers,\n\/\/\/   but this improves the performance of hash tables.\n\/\/\/\n\/\/\/ @implSpec\n\/\/\/ The `hashCode` method defined by class `Object` returns distinct\n\/\/\/ integers for distinct objects as far as is practical.\n\/\/\/\n\/\/\/ @return  a hash code value for this object.\n\/\/\/ @see     java.lang.Object#equals(java.lang.Object)\n\/\/\/ @see     java.lang.System#identityHashCode\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/471\">471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal<\/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\/2024\/06\/image-1-1024x585.png\" alt=\"\" class=\"wp-image-18204\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 471 ma na celu deprekacj\u0119 metod dost\u0119pu do pami\u0119ci w klasie <code>sun.misc.Unsafe<\/code> z zamiarem ich usuni\u0119cia w przysz\u0142ych wydaniach JDK. Propozycja ta ma na celu zach\u0119cenie programist\u00f3w do migracji na obs\u0142ugiwane zamienniki, aby aplikacje mog\u0142y p\u0142ynnie przechodzi\u0107 na nowsze wersje JDK.<\/p>\n\n\n\n<p><strong>Jaki jest problem?<\/strong>: Metody dost\u0119pu do pami\u0119ci pochodz\u0105ce z <code>sun.misc.Unsafe<\/code> s\u0105 niebezpieczne i mog\u0105 prowadzi\u0107 do nieokre\u015blonego zachowania, w tym wywalenia si\u0119 ca\u0142ego JVM. Pomimo \u017ce nie by\u0142y one przeznaczone do szerokiego u\u017cycia, sta\u0142y si\u0119 popularne w\u015br\u00f3d programist\u00f3w, kt\u00f3rzy szukali wi\u0119kszej wydajno\u015bci i mocy ni\u017c oferowane przez standardowe API. Brak kontroli bezpiecze\u0144stwa przed ich u\u017cyciem mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w i awarii aplikacji.<\/p>\n\n\n\n<p><strong>Solution:<\/strong> JEP 471 wprowadza deprecjacj\u0119 metod dost\u0119pu do pami\u0119ci w <code>sun.misc.Unsafe<\/code>, zach\u0119caj\u0105c programist\u00f3w do przej\u015bcia na bezpieczne i wydajne zamienniki: <code>VarHandle<\/code> (<a href=\"https:\/\/openjdk.org\/jeps\/193\">JEP 193<\/a>) i <code>MemorySegment<\/code> (<a href=\"https:\/\/openjdk.org\/jeps\/454\">JEP 454<\/a>). Propozycja przewiduje stopniowe usuwanie dost\u0119pu do metod z <code>sun.misc.Unsafe<\/code> w kilku fazach, zaczynaj\u0105c od ostrze\u017ce\u0144 kompilacji, poprzez ostrze\u017cenia w czasie wykonania, a\u017c po faktyczne usuni\u0119cie metod. Dodano nowe opcje wiersza polece\u0144, takie jak <code>--sun-misc-unsafe-memory-access={allow|warn|debug|deny}<\/code>, umo\u017cliwiaj\u0105ce deweloperom granularne testowanie ocen\u0119 wp\u0142ywu deprecjacji metod dost\u0119pu do pami\u0119ci.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n\n\n\n<p><strong>Przyk\u0142ad kodu z u\u017cyciem <code>sun.misc.Unsafe<\/code>:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Foo {\n\n    private static final Unsafe UNSAFE = ...; \n    private static final long X_OFFSET;\n\n    static {\n        try {\n            X_OFFSET = UNSAFE.objectFieldOffset(Foo.class.getDeclaredField(&quot;x&quot;));\n        } catch (Exception ex) { throw new AssertionError(ex); }\n    }\n\n    private int x;\n\n    public boolean tryToDoubleAtomically() {\n        int oldValue = x;\n        return UNSAFE.compareAndSwapInt(this, X_OFFSET, oldValue, oldValue * 2);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><strong>Przyk\u0142ad kodu z u\u017cyciem <code>VarHandle<\/code>:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Foo {\n\n    private static final VarHandle X_VH;\n\n    static {\n        try {\n            X_VH = MethodHandles.lookup().findVarHandle(Foo.class, &quot;x&quot;, int.class);\n        } catch (Exception ex) { throw new AssertionError(ex); }\n    }\n\n    private int x;\n\n    public boolean tryAtomicallyDoubleX() {\n        int oldValue = x;\n        return X_VH.compareAndSet(this, oldValue, oldValue * 2);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/474\">474: ZGC: Generational Mode by Default<\/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\/2024\/06\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-18206\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-2-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-2-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-2-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-2.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 474 wprowadza zmian\u0119 domy\u015blnego trybu dzia\u0142ania Z Garbage Collector (ZGC) na tryb generacyjny. Dotychczasowy tryb niegeneracyjny zostanie oznaczony jako przestarza\u0142y i planowany do usuni\u0119cia w przysz\u0142ych wydaniach JDK.<\/p>\n\n\n\n<p><strong>Jaki jest problem?:<\/strong> Utrzymywanie zar\u00f3wno generacyjnego, jak i niegeneracyjnego trybu ZGC spowalnia rozw\u00f3j nowych funkcji. Tryb generacyjny ZGC jest uwa\u017cany za lepsze rozwi\u0105zanie dla wi\u0119kszo\u015bci przypadk\u00f3w u\u017cycia, co czyni tryb niegeneracyjny zb\u0119dnym.<\/p>\n\n\n\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> Propozycja zmienia domy\u015bln\u0105 warto\u015b\u0107 opcji <code>ZGenerational<\/code> na <code>true<\/code>, w\u0142\u0105czaj\u0105c tym samym tryb generacyjny ZGC jako domy\u015blny. Po wprowadzeniu tych zmian, uruchomienie JVM z opcj\u0105 <code>-XX:+UseZGC<\/code> b\u0119dzie domy\u015blnie uruchamia\u0142o tryb generacyjny ZGC. Tryb niegeneracyjny zostanie oznaczony jako przestarza\u0142y, a w przysz\u0142o\u015bci planowane jest jego ca\u0142kowite usuni\u0119cie.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\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\/455\">455: Primitive Types in Patterns, instanceof, and switch (Preview)<\/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\/2024\/06\/image-3-1024x585.png\" alt=\"\" class=\"wp-image-18208\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-3-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-3-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-3-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-3.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 455 wprowadza pattern matching dla typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code>, umo\u017cliwiaj\u0105c u\u017cycie tych typ\u00f3w w kontekstach zagnie\u017cd\u017conych i na tak zwanym top-level.<\/p>\n\n\n\n<p><strong>Jaki jest problem?:<\/strong> Obecne ograniczenia dotycz\u0105ce typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code> powoduj\u0105 trudno\u015bci w pisaniu w oparciu o nie jednolitego i ekspresyjnego kodu. Na przyk\u0142ad, <code>switch<\/code> nie obs\u0142uguje wzorc\u00f3w typu prymitywnego, a <code>instanceof<\/code> nie wspiera bezpiecznego rzutowania na typy prymitywne, co prowadzi do niesp\u00f3jnego, potencjalnie skomplikowanego kodu.<\/p>\n\n\n\n<p><strong>Solution:<\/strong> JEP 455 umo\u017cliwia u\u017cycie pattern matchingu typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code>, co pozwala na bezpieczne i ekspresyjne rzutowanie. To eliminuje potrzeb\u0119 r\u0119cznych, potencjalnie niebezpiecznych rzutowa\u0144 oraz umo\u017cliwia bardziej zwi\u0119z\u0142y kod.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>switch (x.getStatus()) {\n    case 0 -&gt; &quot;okay&quot;;\n    case 1 -&gt; &quot;warning&quot;;\n    case 2 -&gt; &quot;error&quot;;\n    case int i -&gt; &quot;unknown status: &quot; + i;\n}\n\nif (i instanceof byte b) {\n    ... \/\/ u\u017cyj b\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/466\">466: Class-File API (Second Preview)<\/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\/2024\/06\/image-4-1024x585.png\" alt=\"\" class=\"wp-image-18210\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-4-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-4-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-4-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-4.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 466 proponuje standardowe API do parsowania, generowania i transformowania plik\u00f3w klas Java. Jest to druga wersja preview API, kt\u00f3ra zosta\u0142a udoskonalona na podstawie do\u015bwiadcze\u0144 i opinii z pierwszej wersji preview wprowadzonej w JEP 457.<\/p>\n\n\n\n<p><strong>Jaki jest problem?:<\/strong> Obecnie istnieje wiele bibliotek do obs\u0142ugi plik\u00f3w klas Java, jednak ka\u017cda z nich ma swoje wady i zalety. Problemem jest szybka ewolucja formatu plik\u00f3w klas, co powoduje, \u017ce biblioteki te nie zawsze s\u0105 aktualne w stosunku do najnowszych wersji JDK. To prowadzi do problem\u00f3w z kompatybilno\u015bci\u0105 i utrudnia wprowadzanie nowych funkcji w JDK, kt\u00f3re to samo u\u017cywam min. biblioteki ASM.<\/p>\n\n\n\n<p><strong>Solution<\/strong>: JEP 466 wprowadza standardowe API do obs\u0142ugi plik\u00f3w klas, kt\u00f3re b\u0119dzie ewoluowa\u0107 razem z formatem plik\u00f3w klas. API to zapewnia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Niezmienno\u015b\u0107 obiekt\u00f3w reprezentuj\u0105cych elementy plik\u00f3w klas.<\/li>\n\n\n\n<li>Struktur\u0119 drzewa, kt\u00f3ra odzwierciedla hierarchi\u0119 pliku klasy.<\/li>\n\n\n\n<li>Nawigacj\u0119 sterowan\u0105 przez u\u017cytkownika, co pozwala na efektywne parsowanie tylko niezb\u0119dnych cz\u0119\u015bci pliku klasy.<\/li>\n\n\n\n<li>Lenistwo w parsowaniu, co zwi\u0119ksza efektywno\u015b\u0107.<\/li>\n\n\n\n<li>Zintegrowane widoki strumieniowe i materializowane.<\/li>\n\n\n\n<li>Transformacje jako operacje p\u0142askiego mapowania na strumieniach element\u00f3w.<\/li>\n\n\n\n<li>Ukrywanie szczeg\u00f3\u0142\u00f3w implementacyjnych, takich jak pula sta\u0142ych czy mapy stosu.<\/li>\n<\/ul>\n\n\n\n<p>API Class-File ma jak wida\u0107 spory zakres i musi generowa\u0107 klasy zgodnie ze specyfikacj\u0105 Java Virtual Machine, dlatego wymaga znacz\u0105cych test\u00f3w jako\u015bci i zgodno\u015bci. W miar\u0119 zast\u0119powania u\u017cycia ASM w JDK przy u\u017cyciu API Class-File, wyniki b\u0119d\u0105 por\u00f3wnywane, aby wykry\u0107 regresje, a tak\u017ce przeprowadza\u0107 obszerne testy wydajno\u015bci.<\/p>\n\n\n\n<p><strong>Jakie zmiany pojawi\u0142y si\u0119 od ostatniej wersji preview?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uproszczono klas\u0119 <code>CodeBuilder<\/code>, usuwaj\u0105c metody \u015bredniego poziomu, kt\u00f3re dublowa\u0142y metody niskiego poziomu lub by\u0142y rzadko u\u017cywane.<\/li>\n\n\n\n<li>Udoskonalono klas\u0119 <code>ClassSignature<\/code>, aby dok\u0142adniej modelowa\u0142a sygnatury generyczne superklas i superinterfejs\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>**Alternatywy: ** Rozwa\u017cano alternatyw\u0119 polegaj\u0105c\u0105 na w\u0142\u0105czeniu ASM do JDK i przej\u0119ciu odpowiedzialno\u015bci za jego dalsze utrzymanie, ale uznano, \u017ce nie jest to w\u0142a\u015bciwe rozwi\u0105zanie. ASM to stara, legacy baza kodu i trudna do ewolucji, a priorytety projektowe, kt\u00f3re kierowa\u0142y jego architektur\u0105, mog\u0105 nie pasowa\u0107 do dzisiejszych reali\u00f3w.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu<\/h4>\n\n\n\n<p><strong>Parsowanie plik\u00f3w klas za pomoc\u0105 wzorc\u00f3w:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CodeModel code = ...\nSet&lt;ClassDesc&gt; deps = new HashSet&lt;&gt;();\nfor (CodeElement e : code) {\n    switch (e) {\n        case FieldInstruction f  -&gt; deps.add(f.owner());\n        case InvokeInstruction i -&gt; deps.add(i.owner());\n        \/\/ ... and so on for instanceof, cast, etc ...\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><strong>Generowanie plik\u00f3w klas za pomoc\u0105 builder\u00f3w:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ClassBuilder classBuilder = ...;\nclassBuilder.withMethod(&quot;fooBar&quot;, MethodTypeDesc.of(CD_void, CD_boolean, CD_int), flags,\n                        methodBuilder -&gt; methodBuilder.withCode(codeBuilder -&gt; {\n    Label label1 = codeBuilder.newLabel();\n    Label label2 = codeBuilder.newLabel();\n    codeBuilder.iload(1)\n        .ifeq(label1)\n        .aload(0)\n        .iload(2)\n        .invokevirtual(ClassDesc.of(&quot;Foo&quot;), &quot;foo&quot;, MethodTypeDesc.of(CD_void, CD_int))\n        .goto_(label2)\n        .labelBinding(label1)\n        .aload(0)\n        .iload(2)\n        .invokevirtual(ClassDesc.of(&quot;Foo&quot;), &quot;bar&quot;, MethodTypeDesc.of(CD_void, CD_int))\n        .labelBinding(label2)\n        .return_();\n});\n<\/code><\/pre>\n\n\n\n<p><strong>Transformacja plik\u00f3w klas:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ClassFile cf = ClassFile.of();\nClassModel classModel = cf.parse(bytes);\nbyte&#091;] newBytes = cf.transform(classModel, (classBuilder, ce) -&gt; {\n    if (ce instanceof MethodModel mm) {\n        classBuilder.transformMethod(mm, (methodBuilder, me)-&gt; {\n            if (me instanceof CodeModel cm) {\n                methodBuilder.transformCode(cm, (codeBuilder, e) -&gt; {\n                    switch (e) {\n                        case InvokeInstruction i\n                                when i.owner().asInternalName().equals(&quot;Foo&quot;) -&gt;\n                            codeBuilder.invoke(i.opcode(), ClassDesc.of(&quot;Bar&quot;), \n                                              i.name().stringValue(),\n                                              i.typeSymbol(), i.isInterface());\n                        default -&gt; codeBuilder.with(e);\n                    }\n                });\n            } else {\n                methodBuilder.with(me);\n            }\n        });\n    } else {\n        classBuilder.with(ce);\n    }\n});\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/473\">473: Stream Gatherers (Second Preview)<\/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\/2024\/06\/image-5-1024x585.png\" alt=\"\" class=\"wp-image-18212\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-5-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-5-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-5-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-5.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 473 proponuje ulepszenie API Stream, aby obs\u0142ugiwa\u0142o niestandardowe operacje po\u015brednie, umo\u017cliwiaj\u0105c bardziej elastyczne przetwarzanie strumieni.<\/p>\n\n\n\n<p><strong>Jaki jest problem?:<\/strong> Obecne API Stream oferuje sta\u0142y zestaw operacji po\u015brednich, kt\u00f3re nie zawsze umo\u017cliwiaj\u0105 realizacj\u0119 bardziej z\u0142o\u017conych zada\u0144. Brak mo\u017cliwo\u015bci definiowania niestandardowych operacji po\u015brednich ogranicza elastyczno\u015b\u0107 i ekspresyjno\u015b\u0107 kodu, zw\u0142aszcza w przypadku zada\u0144, kt\u00f3re wymagaj\u0105 specyficznej logiki transformacji danych.<\/p>\n\n\n\n<p><strong>Solution<\/strong>: JEP 473 wprowadza now\u0105 operacj\u0119 po\u015bredni\u0105 <code>Stream::gather(Gatherer)<\/code>, kt\u00f3ra umo\u017cliwia przetwarzanie element\u00f3w strumienia przy u\u017cyciu zdefiniowanych przez u\u017cytkownika tzw. gatherer\u00f3w. Gatherer to instancja interfejsu <code>java.util.stream.Gatherer<\/code>, kt\u00f3ra reprezentuje transformacj\u0119 element\u00f3w strumienia i umo\u017cliwia manipulacj\u0119 strumieniami o niesko\u0144czonej wielko\u015bci.<\/p>\n\n\n\n<p><strong>Jakie zmiany pojawi\u0142y si\u0119 od ostatniej wersji preview?<\/strong>: Nie wprowadzono \u017cadnych zmian w por\u00f3wnaniu do poprzedniej wersji preview (JEP 461). Celem jest zebranie dodatkowych opinii i do\u015bwiadcze\u0144 z u\u017cytkowania tego API.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n\n\n\n<p><strong>Grupowanie element\u00f3w w sta\u0142e okna:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var result = Stream.iterate(0, i -&gt; i + 1)\n                   .gather(Gatherers.windowFixed(3))\n                   .limit(2)\n                   .toList();\n\n\/\/ result ==&gt; &#091;&#091;0, 1, 2], &#091;3, 4, 5]]\n<\/code><\/pre>\n\n\n\n<p><strong>Definiowanie niestandardowego gatherera:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>record WindowFixed&lt;TR&gt;(int windowSize)\n    implements Gatherer&lt;TR, ArrayList&lt;TR&gt;, List&lt;TR&gt;&gt; {\n\n    public WindowFixed {\n        if (windowSize &lt; 1) {\n            throw new IllegalArgumentException(&quot;window size must be positive&quot;);\n        }\n    }\n\n    @Override\n    public Supplier&lt;ArrayList&lt;TR&gt;&gt; initializer() {\n        return () -&gt; new ArrayList&lt;&gt;(windowSize);\n    }\n\n    @Override\n    public Integrator&lt;ArrayList&lt;TR&gt;, TR, List&lt;TR&gt;&gt; integrator() {\n        return Gatherer.Integrator.ofGreedy((window, element, downstream) -&gt; {\n            window.add(element);\n            if (window.size() &lt; windowSize) {\n                return true;\n            }\n            var result = new ArrayList&lt;TR&gt;(window);\n            window.clear();\n            return downstream.push(result);\n        });\n    }\n\n    @Override\n    public BiConsumer&lt;ArrayList&lt;TR&gt;, Downstream&lt;? super List&lt;TR&gt;&gt;&gt; finisher() {\n        return (window, downstream) -&gt; {\n            if (!downstream.isRejecting() &amp;&amp; !window.isEmpty()) {\n                downstream.push(new ArrayList&lt;TR&gt;(window));\n                window.clear();\n            }\n        };\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/476\">476: Module Import Declarations (Preview)<\/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\/2024\/06\/image-6-1024x585.png\" alt=\"\" class=\"wp-image-18214\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-6-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-6-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-6-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-6.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 476 wprowadza mo\u017cliwo\u015b\u0107 importowania wszystkich pakiet\u00f3w eksportowanych przez modu\u0142 za pomoc\u0105 nowej deklaracji <code>import module<\/code>. U\u0142atwia to ponowne wykorzystanie bibliotek modularnych bez konieczno\u015bci modularizacji w\u0142asnego kodu.<\/p>\n\n\n\n<p>**Jaki jest problem?: ** Obecnie programi\u015bci w wypadku u\u017cywania modu\u0142\u00f3w musz\u0105 r\u0119cznie importowa\u0107 wiele pakiet\u00f3w, co mo\u017ce by\u0107 czasoch\u0142onne i skomplikowane, zw\u0142aszcza dla pocz\u0105tkuj\u0105cych u\u017cytkownik\u00f3w. Brak mo\u017cliwo\u015bci prostego importowania ca\u0142ych modu\u0142\u00f3w prowadzi do redundancji i z\u0142o\u017cono\u015bci kodu.<\/p>\n\n\n\n<p>**Jak proposal rozwi\u0105zuje ten problem?: ** JEP 476 wprowadza now\u0105 deklaracj\u0119 <code>import module<\/code>, kt\u00f3ra pozwala importowa\u0107 wszystkie publiczne klasy i interfejsy z pakiet\u00f3w eksportowanych przez dany modu\u0142 oraz modu\u0142y, kt\u00f3re s\u0105 przez niego transitively wymagane. Dzi\u0119ki temu programi\u015bci mog\u0105 \u0142atwiej i szybciej uzyska\u0107 dost\u0119p do potrzebnych zasob\u00f3w, co upraszcza kod i zmniejsza liczb\u0119 deklaracji importu.<\/p>\n\n\n\n<p>Nie ma jednak r\u00f3\u017cy bez kolc\u00f3w &#8211; u\u017cycie wielu deklaracji <code>import module<\/code> mo\u017ce prowadzi\u0107 do ryzyka konflikt\u00f3w nazw, kt\u00f3re zostan\u0105 wykryte dopiero podczas kompilacji. Rozwi\u0105zanie tych konflikt\u00f3w mo\u017ce wymaga\u0107 dodania pojedynczych deklaracji importu typu, co mo\u017ce by\u0107 uci\u0105\u017cliwe i prowadzi\u0107 do trudno\u015bci w utrzymaniu kodu.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n\n\n\n<p><strong>Importowanie ca\u0142ego modu\u0142u:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import module java.base;\n\nString&#091;] fruits = new String&#091;] { &quot;apple&quot;, &quot;berry&quot;, &quot;citrus&quot; };\nMap&lt;String, String&gt; m = \n    Stream.of(fruits)\n          .collect(Collectors.toMap(\n              s -&gt; s.toUpperCase().substring(0,1), \n            Function.identity()));\n<\/code><\/pre>\n\n\n\n<p><strong>Rozwi\u0105zywanie konflikt\u00f3w nazw:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import module java.base;\nimport module java.sql;\nimport java.sql.Date;\n\nDate d = ... \/\/ Ok! Date jest rozpoznane jako java.sql.Date\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/477\">477: Implicitly Declared Classes and Instance Main Methods (Third Preview)<\/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\/2024\/06\/image-7-1024x585.png\" alt=\"\" class=\"wp-image-18216\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-7-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-7-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-7-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-7.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 477 ma na celu uproszczenie pisania pierwszych program\u00f3w w j\u0119zyku Java, umo\u017cliwiaj\u0105c programistom tworzenie program\u00f3w bez potrzeby zrozumienia zaawansowanych konstrukcji j\u0119zykowych przeznaczonych do du\u017cych program\u00f3w. Funkcja ta wprowadza mo\u017cliwo\u015b\u0107 deklarowania klas implicit i metod main instancji, co pozwala na bardziej zwi\u0119z\u0142e pisanie ma\u0142ych program\u00f3w.<\/p>\n\n\n\n<p><strong>Jaki jest problem?:<\/strong> Obecnie pocz\u0105tkuj\u0105cy programi\u015bci musz\u0105 zrozumie\u0107 wiele z\u0142o\u017conych konstrukcji j\u0119zykowych, takich jak klasy, pakiety, modu\u0142y, modyfikatory dost\u0119pu i statyczne, zanim b\u0119d\u0105 mogli napisa\u0107 prosty program. To mo\u017ce zniech\u0119ca\u0107 nowych u\u017cytkownik\u00f3w i utrudnia\u0107 nauk\u0119.<\/p>\n\n\n\n<p><strong>Solution:<\/strong> JEP 477 upraszcza tworzenie program\u00f3w wprowadzaj\u0105c:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Instancyjne metody main<\/strong>: Metody main nie musz\u0105 by\u0107 statyczne, publiczne ani przyjmowa\u0107 parametru <code>String[]<\/code>.<\/li>\n\n\n\n<li><strong>Implicitne klasy<\/strong>: Pozwala to na pisanie metod i p\u00f3l na najwy\u017cszym poziomie, kt\u00f3re s\u0105 automatycznie zawierane w ukrytej klasie.<\/li>\n\n\n\n<li><strong>Automatyczny import metod I\/O<\/strong>: Metody do prostego wej\u015bcia\/wyj\u015bcia tekstowego s\u0105 automatycznie importowane.<\/li>\n\n\n\n<li><strong>Automatyczny import modu\u0142u java.base<\/strong>: Wszystkie publiczne klasy i interfejsy pakiet\u00f3w eksportowanych przez modu\u0142 java.base s\u0105 automatycznie importowane.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h3>\n\n\n\n<p><strong>Prosty program &#8222;Hello, World!&#8221; w implicitnej klasie:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void main() {\n    println(&quot;Hello, World!&quot;);\n}\n<\/code><\/pre>\n\n\n\n<p><strong>Program interaktywny:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void main() {\n    String name = readln(&quot;Please enter your name: &quot;);\n    print(&quot;Pleased to meet you, &quot;);\n    println(name);\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/480\">480: Structured Concurrency (Third Preview)<\/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\/2024\/06\/image-8-1024x585.png\" alt=\"\" class=\"wp-image-18218\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-8-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-8-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-8-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-8.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 480 wprowadza API do strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, upraszczaj\u0105c programowanie wsp\u00f3\u0142bie\u017cne poprzez traktowanie grup powi\u0105zanych zada\u0144 jako jednej &#8222;jednostki pracy&#8221;. Strukturalna wsp\u00f3\u0142bie\u017cno\u015b\u0107 poprawia obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i u\u0142atwia anulowanie zada\u0144, dodatkowo zapewniaj\u0105c obserwowalno\u015b\u0107 kodu wsp\u00f3\u0142bie\u017cnego.<\/p>\n\n\n\n<p><strong>Jaki jest problem?<\/strong>: Obecne podej\u015bcie do wsp\u00f3\u0142bie\u017cno\u015bci, oparte na ExecutorService i Future, pozwala na nieograniczone \u017cadnymi logicznymi zakresami wzorce wsp\u00f3\u0142bie\u017cno\u015bci, co prowadzi do problem\u00f3w z zarz\u0105dzaniem \u017cyciem w\u0105tk\u00f3w, obs\u0142ug\u0105 b\u0142\u0119d\u00f3w i propagacj\u0105 anulowania. To sprawia, \u017ce kod jest trudniejszy do zrozumienia, debugowania i utrzymania.<\/p>\n\n\n\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> JEP 480 wprowadza API do strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, kt\u00f3re zapewnia hierarchiczne relacje mi\u0119dzy zadaniami i ich podzadaniami, podobnie jak stos wywo\u0142a\u0144 w standardowym kodzie. <code>StructuredTaskScope<\/code>, g\u0142\u00f3wna klasa API, umo\u017cliwia programistom grupowanie powi\u0105zanych zada\u0144, zarz\u0105dzanie nimi jako jedn\u0105 jednostk\u0105 oraz automatyczn\u0105 propagacj\u0119 anulowania i obs\u0142ug\u0119 b\u0142\u0119d\u00f3w. Zwi\u0119ksza te\u017c observability &#8211; narz\u0119dzia tego typu mog\u0105 bowiem wy\u015bwietla\u0107 hierarchi\u0119 zada\u0144, co u\u0142atwia diagnozowanie problem\u00f3w<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h3>\n\n\n\n<p><strong>U\u017cycie StructuredTaskScope w metodzie handle:<\/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&lt;String&gt;  user  = scope.fork(() -&gt; findUser());\n        Supplier&lt;Integer&gt; order = scope.fork(() -&gt; fetchOrder());\n\n        scope.join()            \/\/ Do\u0142\u0105cz do obu podzada\u0144\n             .throwIfFailed();  \/\/ Propaguj b\u0142\u0119dy\n\n        \/\/ Tutaj oba podzadania zako\u0144czy\u0142y si\u0119 sukcesem, wi\u0119c komponuj ich wyniki\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\/481\">481: Scoped Values (Third Preview)<\/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\/2024\/06\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-18220\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-9-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-9-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-9-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-9.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 481 wprowadza warto\u015bci zakresowe (scoped values), kt\u00f3re umo\u017cliwiaj\u0105 metodzie dzielenie si\u0119 niemutowalnymi danymi zar\u00f3wno z wywo\u0142aniami wewn\u0105trz w\u0105tku, jak i z w\u0105tkami potomnymi.<\/p>\n\n\n\n<p>**Solution: ** Zmienne lokalne w\u0105tku (ThreadLocal) s\u0105 trudne do zarz\u0105dzania i maj\u0105 problemy z mutowalno\u015bci\u0105, nieograniczon\u0105 \u017cywotno\u015bci\u0105 oraz kosztownym dziedziczeniem. Te problemy staj\u0105 si\u0119 jeszcze bardziej widoczne przy korzystaniu z du\u017cej liczby w\u0105tk\u00f3w wirtualnych.<\/p>\n\n\n\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> JEP 481 wprowadza warto\u015bci zakresowe jako bezpieczny i wydajny spos\u00f3b na dzielenie danych mi\u0119dzy metodami w tym samym w\u0105tku oraz z w\u0105tkami potomnymi. S\u0105 one niemutowalne, a ich ograniczona \u017cywotno\u015b\u0107 sprawia, \u017ce s\u0105 dost\u0119pne tylko przez okre\u015blony czas podczas wykonywania w\u0105tku, co upraszcza zarz\u0105dzanie i poprawia wydajno\u015b\u0107. Mog\u0105 by\u0107 r\u00f3wnie\u017c dziedziczone przez w\u0105tki potomne tworzone przez <code>StructuredTaskScope<\/code>.<\/p>\n\n\n\n<p>Scoped Values cechuje \u0142atwo\u015b\u0107 u\u017cycia, oferuj\u0105c prosty spos\u00f3b na przekazywanie danych mi\u0119dzy metodami, oraz przejrzysto\u015b\u0107, gdy\u017c \u017cywotno\u015b\u0107 udost\u0119pnianych danych jest wyra\u017anie widoczna w strukturze kodu. S\u0105 one \u0142atwiejsze do zrozumienia ni\u017c zmienne lokalne w\u0105tku i maj\u0105 ni\u017csze koszty pami\u0119ci i czasu, szczeg\u00f3lnie gdy s\u0105 u\u017cywane razem z w\u0105tkami wirtualnymi (JEP 444) i zorganizowan\u0105 wsp\u00f3\u0142bie\u017cno\u015bci\u0105 (JEP 480).<\/p>\n\n\n\n<p><strong>Przyk\u0142ad u\u017cycia warto\u015bci zakresowych w frameworku webowym:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Framework {\n\n    private final static ScopedValue&lt;FrameworkContext&gt; CONTEXT\n                        = ScopedValue.newInstance();\n\n    void serve(Request request, Response response) {\n        var context = createContext(request);\n        ScopedValue.runWhere(CONTEXT, context,         \n                   () -&gt; Application.handle(request, response));\n    }\n    \n    public PersistedObject readKey(String key) {\n        var context = CONTEXT.get();                   \n        var db = getDBConnection(context);\n        db.readKey(key);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>W tym przyk\u0142adzie <code>CONTEXT<\/code> jest warto\u015bci\u0105 zakresow\u0105, kt\u00f3ra jest ustawiana w metodzie <code>serve<\/code> i dost\u0119pna w metodzie <code>readKey<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/482\">482: Flexible Constructor Bodies (Second Preview)<\/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\/2024\/06\/image-10-1024x585.png\" alt=\"\" class=\"wp-image-18222\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-10-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-10-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-10-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-10.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 482 wprowadza mo\u017cliwo\u015b\u0107 umieszczania instrukcji w konstruktorach przed wywo\u0142aniem innego konstruktora (<code>super(..)<\/code> lub <code>this(..)<\/code>) w j\u0119zyku Java. Instrukcje te nie mog\u0105 odwo\u0142ywa\u0107 si\u0119 do tworzonej instancji, ale mog\u0105 inicjalizowa\u0107 jej pola.<\/p>\n\n\n\n<p><strong>Jaki jest problem?<\/strong>: W j\u0119zyku Java konstruktor musi zaczyna\u0107 si\u0119 od wywo\u0142ania innego konstruktora (<code>super(..)<\/code> lub <code>this(..)<\/code>). To ograniczenie uniemo\u017cliwia umieszczanie kodu inicjalizacyjnego przed wywo\u0142aniem konstruktora nadklasy, co mo\u017ce prowadzi\u0107 do problem\u00f3w z nadpisywaniem metod i inicjalizacj\u0105 p\u00f3l.<\/p>\n\n\n\n<p><strong>Solution<\/strong>: JEP 482 wprowadza zmiany do gramatyki konstruktor\u00f3w, pozwalaj\u0105c na umieszczanie instrukcji przed wywo\u0142aniem konstruktora. Kod ten mo\u017ce inicjalizowa\u0107 pola, ale nie mo\u017ce odwo\u0142ywa\u0107 si\u0119 do tworzonej instancji. Dzi\u0119ki temu klasa jest bardziej niezawodna, gdy metody s\u0105 nadpisywane.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad weryfikacji argument\u00f3w konstruktora przed wywo\u0142aniem konstruktora nadklasy:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class PositiveBigInteger extends BigInteger {\n\n    public PositiveBigInteger(long value) {\n        if (value &lt;= 0) throw new IllegalArgumentException(..);\n        super(value);\n    }}\n<\/code><\/pre>\n\n\n\n<p>W tym przyk\u0142adzie argument <code>value<\/code> jest weryfikowany przed wywo\u0142aniem konstruktora nadklasy <code>BigInteger<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"incubation\" data-num=3>Incubation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/469\">469: Vector API (Eighth Incubator)<\/a><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11-1024x580.png\" alt=\"\" class=\"wp-image-18224\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11-1024x580.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11-300x170.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11-768x435.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11.png 1217w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>JEP 469 rozszerza API, kt\u00f3re umo\u017cliwia wyra\u017canie oblicze\u0144 wektorowych, kompilowanych do natywnych instrukcji wektorowych na obs\u0142ugiwanych architekturach CPU, oferuj\u0105c wydajno\u015b\u0107 przewy\u017cszaj\u0105c\u0105 r\u00f3wnowa\u017cne obliczenia skalarne.<\/p>\n\n\n\n<p><strong>What issue do they address?:<\/strong> Koncepcja oblicze\u0144 wektorowych, kt\u00f3ra umo\u017cliwia wykonywanie operacji na wielu danych jednocze\u015bnie, by\u0142a trudna do wyra\u017cenia w Javie. W zwi\u0105zku z tym \u015brodowisko polega\u0142o ona na algorytmie auto-wektoryzacji HotSpot, co z kolei ogranicza\u0142o jej praktyczn\u0105 u\u017cyteczno\u015b\u0107 i wydajno\u015b\u0107.<\/p>\n\n\n\n<p><strong>Solution:<\/strong> Vector API w j\u0119zyku Java umo\u017cliwia tworzenie skomplikowanych algorytm\u00f3w wektorowych z lepsz\u0105 przewidywalno\u015bci\u0105 i niezawodno\u015bci\u0105. Wykorzystuje istniej\u0105cy auto-wektoryzator HotSpot, oferuj\u0105c u\u017cytkownikowi bardziej przewidywalny model.<\/p>\n\n\n\n<p><strong>Changes since the last incubator:<\/strong> API zosta\u0142o ponownie wprowadzone do inkubacji w JDK 22, z drobnymi ulepszeniami z JDK 21, takimi jak poprawki b\u0142\u0119d\u00f3w i zwi\u0119kszenie wydajno\u015bci. Oczekuje si\u0119, \u017ce przed wprowadzeniem wersji Preview zostanie zako\u0144czony Projekt Valhalla.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Stable 467: Markdown Documentation Comments JEP 467 wprowadza mo\u017cliwo\u015b\u0107 pisania komentarzy dokumentacyjnych JavaDoc za pomoc\u0105 Markdown, opr\u00f3cz dotychczasowego formatu HTML i tag\u00f3w JavaDoc. U\u0142atwia to tworzenie i czytanie dokumentacji umieszczanej bezpo\u015brednio w kodzie \u017ar\u00f3d\u0142owym. Jaki jest problem?: Obecne komentarze dokumentacyjne JavaDoc korzystaj\u0105 z HTML i specyficznych tag\u00f3w JavaDoc, co jest trudne do pisania i czytania. [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":18226,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-18200","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"17","feature_image_blog":false,"weekly_summary":false,"push_notification_image":false,"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 23: Co przyniesie nowa edycja? - JVM Weekly vol. 174 - 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-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\" \/>\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 23: Co przyniesie nowa edycja? - JVM Weekly vol. 174 - Vived\" \/>\n<meta property=\"og:description\" content=\"Stable 467: Markdown Documentation Comments JEP 467 wprowadza mo\u017cliwo\u015b\u0107 pisania komentarzy dokumentacyjnych JavaDoc za pomoc\u0105 Markdown, opr\u00f3cz dotychczasowego formatu HTML i tag\u00f3w JavaDoc. U\u0142atwia to tworzenie i czytanie dokumentacji umieszczanej bezpo\u015brednio w kodzie \u017ar\u00f3d\u0142owym. Jaki jest problem?: Obecne komentarze dokumentacyjne JavaDoc korzystaj\u0105 z HTML i specyficznych tag\u00f3w JavaDoc, co jest trudne do pisania i czytania. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-07T10:48:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-07T10:49:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780-1024x576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\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-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Feature Freeze dla JDK 23: Co przyniesie nowa edycja? &#8211; JVM Weekly vol. 174\",\"datePublished\":\"2024-06-07T10:48:20+00:00\",\"dateModified\":\"2024-06-07T10:49:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\"},\"wordCount\":2477,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\",\"url\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\",\"name\":\"Feature Freeze dla JDK 23: Co przyniesie nowa edycja? - JVM Weekly vol. 174 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png\",\"datePublished\":\"2024-06-07T10:48:20+00:00\",\"dateModified\":\"2024-06-07T10:49:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#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 23: Co przyniesie nowa edycja? &#8211; JVM Weekly vol. 174\"}]},{\"@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 23: Co przyniesie nowa edycja? - JVM Weekly vol. 174 - 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-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/","og_locale":"pl_PL","og_type":"article","og_title":"Feature Freeze dla JDK 23: Co przyniesie nowa edycja? - JVM Weekly vol. 174 - Vived","og_description":"Stable 467: Markdown Documentation Comments JEP 467 wprowadza mo\u017cliwo\u015b\u0107 pisania komentarzy dokumentacyjnych JavaDoc za pomoc\u0105 Markdown, opr\u00f3cz dotychczasowego formatu HTML i tag\u00f3w JavaDoc. U\u0142atwia to tworzenie i czytanie dokumentacji umieszczanej bezpo\u015brednio w kodzie \u017ar\u00f3d\u0142owym. Jaki jest problem?: Obecne komentarze dokumentacyjne JavaDoc korzystaj\u0105 z HTML i specyficznych tag\u00f3w JavaDoc, co jest trudne do pisania i czytania. [&hellip;]","og_url":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/","og_site_name":"Vived","article_published_time":"2024-06-07T10:48:20+00:00","article_modified_time":"2024-06-07T10:49:28+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780-1024x576.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-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Feature Freeze dla JDK 23: Co przyniesie nowa edycja? &#8211; JVM Weekly vol. 174","datePublished":"2024-06-07T10:48:20+00:00","dateModified":"2024-06-07T10:49:28+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/"},"wordCount":2477,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/","url":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/","name":"Feature Freeze dla JDK 23: Co przyniesie nowa edycja? - JVM Weekly vol. 174 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png","datePublished":"2024-06-07T10:48:20+00:00","dateModified":"2024-06-07T10:49:28+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/Group-780.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-23-co-przyniesie-nowa-edycja-jvm-weekly-vol-174\/#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 23: Co przyniesie nowa edycja? &#8211; JVM Weekly vol. 174"}]},{"@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\/467\">467: Markdown Documentation Comments<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/467\">467: Markdown Documentation Comments<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18202,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1024x585.png\" alt=\"\" class=\"wp-image-18202\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1024x585.png\" alt=\"\" class=\"wp-image-18202\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/openjdk.org\/jeps\/467\">JEP 467<\/a> wprowadza mo\u017cliwo\u015b\u0107 pisania komentarzy dokumentacyjnych JavaDoc za pomoc\u0105 Markdown, opr\u00f3cz dotychczasowego formatu HTML i tag\u00f3w JavaDoc. U\u0142atwia to tworzenie i czytanie dokumentacji umieszczanej bezpo\u015brednio w kodzie \u017ar\u00f3d\u0142owym.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/openjdk.org\/jeps\/467\">JEP 467<\/a> wprowadza mo\u017cliwo\u015b\u0107 pisania komentarzy dokumentacyjnych JavaDoc za pomoc\u0105 Markdown, opr\u00f3cz dotychczasowego formatu HTML i tag\u00f3w JavaDoc. U\u0142atwia to tworzenie i czytanie dokumentacji umieszczanej bezpo\u015brednio w kodzie \u017ar\u00f3d\u0142owym.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?:<\/strong> Obecne komentarze dokumentacyjne JavaDoc korzystaj\u0105 z HTML i specyficznych tag\u00f3w JavaDoc, co jest trudne do pisania i czytania. HTML ma to do siebie, \u017ce bardzo \"zanieczyszcza\" tre\u015b\u0107, co zniech\u0119ca programist\u00f3w do tworzenia dobrze sformatowanej dokumentacji. Dodatkowo, tagi do dokumentowania JavaDoc s\u0105 mniej znane i cz\u0119sto wymagaj\u0105 konsultacji z ich w\u0142asn\u0105 dokumentacj\u0105 (co jak na to spojrze\u0107 robi robi si\u0119 nieco meta).<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?:<\/strong> Obecne komentarze dokumentacyjne JavaDoc korzystaj\u0105 z HTML i specyficznych tag\u00f3w JavaDoc, co jest trudne do pisania i czytania. HTML ma to do siebie, \u017ce bardzo \"zanieczyszcza\" tre\u015b\u0107, co zniech\u0119ca programist\u00f3w do tworzenia dobrze sformatowanej dokumentacji. Dodatkowo, tagi do dokumentowania JavaDoc s\u0105 mniej znane i cz\u0119sto wymagaj\u0105 konsultacji z ich w\u0142asn\u0105 dokumentacj\u0105 (co jak na to spojrze\u0107 robi robi si\u0119 nieco meta).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution:<\/strong> JEP 467 wprowadza wsparcie dla Markdown w komentarzach dokumentacyjnych, co umo\u017cliwia bardziej zwi\u0119z\u0142e i czytelne formatowanie dokumentacji. Markdown jest obecnie standardem w\u015br\u00f3d j\u0119zyk\u00f3w znacznik\u00f3w u\u017cywanych przez programist\u00f3w, a na jego popularyzacje wp\u0142yn\u0105\u0142 min. GitHub, wi\u0119c sk\u0142adnia po prostu jest szeroko u\u017cywana i znana (ciekawostka - wszystkie edycje JVM Weekly powstaj\u0105 oryginalnie w\u0142a\u015bnie w Markdownie). Dzi\u0119ki temu programi\u015bci mog\u0105 pisa\u0107 dokumentacj\u0119 szybciej i z mniejszym wysi\u0142kiem, nadal maj\u0105c mo\u017cliwo\u015b\u0107 korzystania z HTML i tag\u00f3w JavaDoc tam, gdzie jest to konieczne (dodatkowo - wiele popularnych parser\u00f3w Markdown jest kompatybilnych ze wstawkami z HTML).<\/p>\n","innerContent":["\n<p><strong>Solution:<\/strong> JEP 467 wprowadza wsparcie dla Markdown w komentarzach dokumentacyjnych, co umo\u017cliwia bardziej zwi\u0119z\u0142e i czytelne formatowanie dokumentacji. Markdown jest obecnie standardem w\u015br\u00f3d j\u0119zyk\u00f3w znacznik\u00f3w u\u017cywanych przez programist\u00f3w, a na jego popularyzacje wp\u0142yn\u0105\u0142 min. GitHub, wi\u0119c sk\u0142adnia po prostu jest szeroko u\u017cywana i znana (ciekawostka - wszystkie edycje JVM Weekly powstaj\u0105 oryginalnie w\u0142a\u015bnie w Markdownie). Dzi\u0119ki temu programi\u015bci mog\u0105 pisa\u0107 dokumentacj\u0119 szybciej i z mniejszym wysi\u0142kiem, nadal maj\u0105c mo\u017cliwo\u015b\u0107 korzystania z HTML i tag\u00f3w JavaDoc tam, gdzie jest to konieczne (dodatkowo - wiele popularnych parser\u00f3w Markdown jest kompatybilnych ze wstawkami z HTML).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tradycyjny komentarz JavaDoc:<\/p>\n","innerContent":["\n<p>Tradycyjny komentarz JavaDoc:<\/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>\/**\n * Returns a &lt;b&gt;hash code&lt;\/b&gt; value for the object.\n * &lt;p&gt;\n * The general contract of {@code hashCode} is:\n * &lt;ul&gt;\n * &lt;li&gt;Must consistently return the same integer for the same object,\n *     provided no information used in {@code equals} comparisons is modified.\n * &lt;li&gt;If two objects are equal according to the {@link #equals(Object)} method,\n *     calling {@code hashCode} on each must produce the same result.\n * &lt;li&gt;It is not required that unequal objects produce distinct integers,\n *     but this improves the performance of hash tables.\n * &lt;\/ul&gt;\n *\n * @implSpec\n * The {@code hashCode} method defined by class {@code Object} returns distinct\n * integers for distinct objects as far as is practical.\n *\n * @return  a hash code value for this object.\n * @see     java.lang.Object#equals(java.lang.Object)\n * @see     java.lang.System#identityHashCode\n *\/\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>\/**\n * Returns a &lt;b&gt;hash code&lt;\/b&gt; value for the object.\n * &lt;p&gt;\n * The general contract of {@code hashCode} is:\n * &lt;ul&gt;\n * &lt;li&gt;Must consistently return the same integer for the same object,\n *     provided no information used in {@code equals} comparisons is modified.\n * &lt;li&gt;If two objects are equal according to the {@link #equals(Object)} method,\n *     calling {@code hashCode} on each must produce the same result.\n * &lt;li&gt;It is not required that unequal objects produce distinct integers,\n *     but this improves the performance of hash tables.\n * &lt;\/ul&gt;\n *\n * @implSpec\n * The {@code hashCode} method defined by class {@code Object} returns distinct\n * integers for distinct objects as far as is practical.\n *\n * @return  a hash code value for this object.\n * @see     java.lang.Object#equals(java.lang.Object)\n * @see     java.lang.System#identityHashCode\n *\/\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ten sam komentarz Markdown:<\/p>\n","innerContent":["\n<p>Ten sam komentarz Markdown:<\/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>\/\/\/ Returns a **hash code** value for the object.\n\/\/\/ \n\/\/\/ The general contract of `hashCode` is:\n\/\/\/\n\/\/\/ - Must consistently return the same integer for the same object,\n\/\/\/   provided no information used in `equals` comparisons is modified.\n\/\/\/ - If two objects are equal according to the &#91;equals]&#91;#equals(Object)] method,\n\/\/\/   calling `hashCode` on each must produce the same result.\n\/\/\/ - It is not required that unequal objects produce distinct integers,\n\/\/\/   but this improves the performance of hash tables.\n\/\/\/\n\/\/\/ @implSpec\n\/\/\/ The `hashCode` method defined by class `Object` returns distinct\n\/\/\/ integers for distinct objects as far as is practical.\n\/\/\/\n\/\/\/ @return  a hash code value for this object.\n\/\/\/ @see     java.lang.Object#equals(java.lang.Object)\n\/\/\/ @see     java.lang.System#identityHashCode\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>\/\/\/ Returns a **hash code** value for the object.\n\/\/\/ \n\/\/\/ The general contract of `hashCode` is:\n\/\/\/\n\/\/\/ - Must consistently return the same integer for the same object,\n\/\/\/   provided no information used in `equals` comparisons is modified.\n\/\/\/ - If two objects are equal according to the &#91;equals]&#91;#equals(Object)] method,\n\/\/\/   calling `hashCode` on each must produce the same result.\n\/\/\/ - It is not required that unequal objects produce distinct integers,\n\/\/\/   but this improves the performance of hash tables.\n\/\/\/\n\/\/\/ @implSpec\n\/\/\/ The `hashCode` method defined by class `Object` returns distinct\n\/\/\/ integers for distinct objects as far as is practical.\n\/\/\/\n\/\/\/ @return  a hash code value for this object.\n\/\/\/ @see     java.lang.Object#equals(java.lang.Object)\n\/\/\/ @see     java.lang.System#identityHashCode\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\/471\">471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/471\">471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18204,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1-1024x585.png\" alt=\"\" class=\"wp-image-18204\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-1-1024x585.png\" alt=\"\" class=\"wp-image-18204\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 471 ma na celu deprekacj\u0119 metod dost\u0119pu do pami\u0119ci w klasie <code>sun.misc.Unsafe<\/code> z zamiarem ich usuni\u0119cia w przysz\u0142ych wydaniach JDK. Propozycja ta ma na celu zach\u0119cenie programist\u00f3w do migracji na obs\u0142ugiwane zamienniki, aby aplikacje mog\u0142y p\u0142ynnie przechodzi\u0107 na nowsze wersje JDK.<\/p>\n","innerContent":["\n<p>JEP 471 ma na celu deprekacj\u0119 metod dost\u0119pu do pami\u0119ci w klasie <code>sun.misc.Unsafe<\/code> z zamiarem ich usuni\u0119cia w przysz\u0142ych wydaniach JDK. Propozycja ta ma na celu zach\u0119cenie programist\u00f3w do migracji na obs\u0142ugiwane zamienniki, aby aplikacje mog\u0142y p\u0142ynnie przechodzi\u0107 na nowsze wersje JDK.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?<\/strong>: Metody dost\u0119pu do pami\u0119ci pochodz\u0105ce z <code>sun.misc.Unsafe<\/code> s\u0105 niebezpieczne i mog\u0105 prowadzi\u0107 do nieokre\u015blonego zachowania, w tym wywalenia si\u0119 ca\u0142ego JVM. Pomimo \u017ce nie by\u0142y one przeznaczone do szerokiego u\u017cycia, sta\u0142y si\u0119 popularne w\u015br\u00f3d programist\u00f3w, kt\u00f3rzy szukali wi\u0119kszej wydajno\u015bci i mocy ni\u017c oferowane przez standardowe API. Brak kontroli bezpiecze\u0144stwa przed ich u\u017cyciem mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w i awarii aplikacji.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?<\/strong>: Metody dost\u0119pu do pami\u0119ci pochodz\u0105ce z <code>sun.misc.Unsafe<\/code> s\u0105 niebezpieczne i mog\u0105 prowadzi\u0107 do nieokre\u015blonego zachowania, w tym wywalenia si\u0119 ca\u0142ego JVM. Pomimo \u017ce nie by\u0142y one przeznaczone do szerokiego u\u017cycia, sta\u0142y si\u0119 popularne w\u015br\u00f3d programist\u00f3w, kt\u00f3rzy szukali wi\u0119kszej wydajno\u015bci i mocy ni\u017c oferowane przez standardowe API. Brak kontroli bezpiecze\u0144stwa przed ich u\u017cyciem mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w i awarii aplikacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution:<\/strong> JEP 471 wprowadza deprecjacj\u0119 metod dost\u0119pu do pami\u0119ci w <code>sun.misc.Unsafe<\/code>, zach\u0119caj\u0105c programist\u00f3w do przej\u015bcia na bezpieczne i wydajne zamienniki: <code>VarHandle<\/code> (<a href=\"https:\/\/openjdk.org\/jeps\/193\">JEP 193<\/a>) i <code>MemorySegment<\/code> (<a href=\"https:\/\/openjdk.org\/jeps\/454\">JEP 454<\/a>). Propozycja przewiduje stopniowe usuwanie dost\u0119pu do metod z <code>sun.misc.Unsafe<\/code> w kilku fazach, zaczynaj\u0105c od ostrze\u017ce\u0144 kompilacji, poprzez ostrze\u017cenia w czasie wykonania, a\u017c po faktyczne usuni\u0119cie metod. Dodano nowe opcje wiersza polece\u0144, takie jak <code>--sun-misc-unsafe-memory-access={allow|warn|debug|deny}<\/code>, umo\u017cliwiaj\u0105ce deweloperom granularne testowanie ocen\u0119 wp\u0142ywu deprecjacji metod dost\u0119pu do pami\u0119ci.<\/p>\n","innerContent":["\n<p><strong>Solution:<\/strong> JEP 471 wprowadza deprecjacj\u0119 metod dost\u0119pu do pami\u0119ci w <code>sun.misc.Unsafe<\/code>, zach\u0119caj\u0105c programist\u00f3w do przej\u015bcia na bezpieczne i wydajne zamienniki: <code>VarHandle<\/code> (<a href=\"https:\/\/openjdk.org\/jeps\/193\">JEP 193<\/a>) i <code>MemorySegment<\/code> (<a href=\"https:\/\/openjdk.org\/jeps\/454\">JEP 454<\/a>). Propozycja przewiduje stopniowe usuwanie dost\u0119pu do metod z <code>sun.misc.Unsafe<\/code> w kilku fazach, zaczynaj\u0105c od ostrze\u017ce\u0144 kompilacji, poprzez ostrze\u017cenia w czasie wykonania, a\u017c po faktyczne usuni\u0119cie metod. Dodano nowe opcje wiersza polece\u0144, takie jak <code>--sun-misc-unsafe-memory-access={allow|warn|debug|deny}<\/code>, umo\u017cliwiaj\u0105ce deweloperom granularne testowanie ocen\u0119 wp\u0142ywu deprecjacji metod dost\u0119pu do pami\u0119ci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad kodu z u\u017cyciem <code>sun.misc.Unsafe<\/code>:<\/strong><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad kodu z u\u017cyciem <code>sun.misc.Unsafe<\/code>:<\/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 Foo {\n\n    private static final Unsafe UNSAFE = ...; \n    private static final long X_OFFSET;\n\n    static {\n        try {\n            X_OFFSET = UNSAFE.objectFieldOffset(Foo.class.getDeclaredField(\"x\"));\n        } catch (Exception ex) { throw new AssertionError(ex); }\n    }\n\n    private int x;\n\n    public boolean tryToDoubleAtomically() {\n        int oldValue = x;\n        return UNSAFE.compareAndSwapInt(this, X_OFFSET, oldValue, oldValue * 2);\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class Foo {\n\n    private static final Unsafe UNSAFE = ...; \n    private static final long X_OFFSET;\n\n    static {\n        try {\n            X_OFFSET = UNSAFE.objectFieldOffset(Foo.class.getDeclaredField(\"x\"));\n        } catch (Exception ex) { throw new AssertionError(ex); }\n    }\n\n    private int x;\n\n    public boolean tryToDoubleAtomically() {\n        int oldValue = x;\n        return UNSAFE.compareAndSwapInt(this, X_OFFSET, oldValue, oldValue * 2);\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad kodu z u\u017cyciem <code>VarHandle<\/code>:<\/strong><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad kodu z u\u017cyciem <code>VarHandle<\/code>:<\/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 Foo {\n\n    private static final VarHandle X_VH;\n\n    static {\n        try {\n            X_VH = MethodHandles.lookup().findVarHandle(Foo.class, \"x\", int.class);\n        } catch (Exception ex) { throw new AssertionError(ex); }\n    }\n\n    private int x;\n\n    public boolean tryAtomicallyDoubleX() {\n        int oldValue = x;\n        return X_VH.compareAndSet(this, oldValue, oldValue * 2);\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class Foo {\n\n    private static final VarHandle X_VH;\n\n    static {\n        try {\n            X_VH = MethodHandles.lookup().findVarHandle(Foo.class, \"x\", int.class);\n        } catch (Exception ex) { throw new AssertionError(ex); }\n    }\n\n    private int x;\n\n    public boolean tryAtomicallyDoubleX() {\n        int oldValue = x;\n        return X_VH.compareAndSet(this, oldValue, oldValue * 2);\n    }\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\/474\">474: ZGC: Generational Mode by Default<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/474\">474: ZGC: Generational Mode by Default<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18206,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-18206\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-18206\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 474 wprowadza zmian\u0119 domy\u015blnego trybu dzia\u0142ania Z Garbage Collector (ZGC) na tryb generacyjny. Dotychczasowy tryb niegeneracyjny zostanie oznaczony jako przestarza\u0142y i planowany do usuni\u0119cia w przysz\u0142ych wydaniach JDK.<\/p>\n","innerContent":["\n<p>JEP 474 wprowadza zmian\u0119 domy\u015blnego trybu dzia\u0142ania Z Garbage Collector (ZGC) na tryb generacyjny. Dotychczasowy tryb niegeneracyjny zostanie oznaczony jako przestarza\u0142y i planowany do usuni\u0119cia w przysz\u0142ych wydaniach JDK.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?:<\/strong> Utrzymywanie zar\u00f3wno generacyjnego, jak i niegeneracyjnego trybu ZGC spowalnia rozw\u00f3j nowych funkcji. Tryb generacyjny ZGC jest uwa\u017cany za lepsze rozwi\u0105zanie dla wi\u0119kszo\u015bci przypadk\u00f3w u\u017cycia, co czyni tryb niegeneracyjny zb\u0119dnym.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?:<\/strong> Utrzymywanie zar\u00f3wno generacyjnego, jak i niegeneracyjnego trybu ZGC spowalnia rozw\u00f3j nowych funkcji. Tryb generacyjny ZGC jest uwa\u017cany za lepsze rozwi\u0105zanie dla wi\u0119kszo\u015bci przypadk\u00f3w u\u017cycia, co czyni tryb niegeneracyjny zb\u0119dnym.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> Propozycja zmienia domy\u015bln\u0105 warto\u015b\u0107 opcji <code>ZGenerational<\/code> na <code>true<\/code>, w\u0142\u0105czaj\u0105c tym samym tryb generacyjny ZGC jako domy\u015blny. Po wprowadzeniu tych zmian, uruchomienie JVM z opcj\u0105 <code>-XX:+UseZGC<\/code> b\u0119dzie domy\u015blnie uruchamia\u0142o tryb generacyjny ZGC. Tryb niegeneracyjny zostanie oznaczony jako przestarza\u0142y, a w przysz\u0142o\u015bci planowane jest jego ca\u0142kowite usuni\u0119cie.<\/p>\n","innerContent":["\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> Propozycja zmienia domy\u015bln\u0105 warto\u015b\u0107 opcji <code>ZGenerational<\/code> na <code>true<\/code>, w\u0142\u0105czaj\u0105c tym samym tryb generacyjny ZGC jako domy\u015blny. Po wprowadzeniu tych zmian, uruchomienie JVM z opcj\u0105 <code>-XX:+UseZGC<\/code> b\u0119dzie domy\u015blnie uruchamia\u0142o tryb generacyjny ZGC. Tryb niegeneracyjny zostanie oznaczony jako przestarza\u0142y, a w przysz\u0142o\u015bci planowane jest jego ca\u0142kowite usuni\u0119cie.<\/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":[],"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\/455\">455: Primitive Types in Patterns, instanceof, and switch (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/455\">455: Primitive Types in Patterns, instanceof, and switch (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18208,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-3-1024x585.png\" alt=\"\" class=\"wp-image-18208\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-3-1024x585.png\" alt=\"\" class=\"wp-image-18208\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 455 wprowadza pattern matching dla typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code>, umo\u017cliwiaj\u0105c u\u017cycie tych typ\u00f3w w kontekstach zagnie\u017cd\u017conych i na tak zwanym top-level.<\/p>\n","innerContent":["\n<p>JEP 455 wprowadza pattern matching dla typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code>, umo\u017cliwiaj\u0105c u\u017cycie tych typ\u00f3w w kontekstach zagnie\u017cd\u017conych i na tak zwanym top-level.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?:<\/strong> Obecne ograniczenia dotycz\u0105ce typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code> powoduj\u0105 trudno\u015bci w pisaniu w oparciu o nie jednolitego i ekspresyjnego kodu. Na przyk\u0142ad, <code>switch<\/code> nie obs\u0142uguje wzorc\u00f3w typu prymitywnego, a <code>instanceof<\/code> nie wspiera bezpiecznego rzutowania na typy prymitywne, co prowadzi do niesp\u00f3jnego, potencjalnie skomplikowanego kodu.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?:<\/strong> Obecne ograniczenia dotycz\u0105ce typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code> powoduj\u0105 trudno\u015bci w pisaniu w oparciu o nie jednolitego i ekspresyjnego kodu. Na przyk\u0142ad, <code>switch<\/code> nie obs\u0142uguje wzorc\u00f3w typu prymitywnego, a <code>instanceof<\/code> nie wspiera bezpiecznego rzutowania na typy prymitywne, co prowadzi do niesp\u00f3jnego, potencjalnie skomplikowanego kodu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution:<\/strong> JEP 455 umo\u017cliwia u\u017cycie pattern matchingu typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code>, co pozwala na bezpieczne i ekspresyjne rzutowanie. To eliminuje potrzeb\u0119 r\u0119cznych, potencjalnie niebezpiecznych rzutowa\u0144 oraz umo\u017cliwia bardziej zwi\u0119z\u0142y kod.<\/p>\n","innerContent":["\n<p><strong>Solution:<\/strong> JEP 455 umo\u017cliwia u\u017cycie pattern matchingu typ\u00f3w prymitywnych w <code>instanceof<\/code> i <code>switch<\/code>, co pozwala na bezpieczne i ekspresyjne rzutowanie. To eliminuje potrzeb\u0119 r\u0119cznych, potencjalnie niebezpiecznych rzutowa\u0144 oraz umo\u017cliwia bardziej zwi\u0119z\u0142y kod.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>switch (x.getStatus()) {\n    case 0 -&gt; \"okay\";\n    case 1 -&gt; \"warning\";\n    case 2 -&gt; \"error\";\n    case int i -&gt; \"unknown status: \" + i;\n}\n\nif (i instanceof byte b) {\n    ... \/\/ u\u017cyj b\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>switch (x.getStatus()) {\n    case 0 -&gt; \"okay\";\n    case 1 -&gt; \"warning\";\n    case 2 -&gt; \"error\";\n    case int i -&gt; \"unknown status: \" + i;\n}\n\nif (i instanceof byte b) {\n    ... \/\/ u\u017cyj b\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\/466\">466: Class-File API (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/466\">466: Class-File API (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18210,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-4-1024x585.png\" alt=\"\" class=\"wp-image-18210\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-4-1024x585.png\" alt=\"\" class=\"wp-image-18210\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 466 proponuje standardowe API do parsowania, generowania i transformowania plik\u00f3w klas Java. Jest to druga wersja preview API, kt\u00f3ra zosta\u0142a udoskonalona na podstawie do\u015bwiadcze\u0144 i opinii z pierwszej wersji preview wprowadzonej w JEP 457.<\/p>\n","innerContent":["\n<p>JEP 466 proponuje standardowe API do parsowania, generowania i transformowania plik\u00f3w klas Java. Jest to druga wersja preview API, kt\u00f3ra zosta\u0142a udoskonalona na podstawie do\u015bwiadcze\u0144 i opinii z pierwszej wersji preview wprowadzonej w JEP 457.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?:<\/strong> Obecnie istnieje wiele bibliotek do obs\u0142ugi plik\u00f3w klas Java, jednak ka\u017cda z nich ma swoje wady i zalety. Problemem jest szybka ewolucja formatu plik\u00f3w klas, co powoduje, \u017ce biblioteki te nie zawsze s\u0105 aktualne w stosunku do najnowszych wersji JDK. To prowadzi do problem\u00f3w z kompatybilno\u015bci\u0105 i utrudnia wprowadzanie nowych funkcji w JDK, kt\u00f3re to samo u\u017cywam min. biblioteki ASM.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?:<\/strong> Obecnie istnieje wiele bibliotek do obs\u0142ugi plik\u00f3w klas Java, jednak ka\u017cda z nich ma swoje wady i zalety. Problemem jest szybka ewolucja formatu plik\u00f3w klas, co powoduje, \u017ce biblioteki te nie zawsze s\u0105 aktualne w stosunku do najnowszych wersji JDK. To prowadzi do problem\u00f3w z kompatybilno\u015bci\u0105 i utrudnia wprowadzanie nowych funkcji w JDK, kt\u00f3re to samo u\u017cywam min. biblioteki ASM.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution<\/strong>: JEP 466 wprowadza standardowe API do obs\u0142ugi plik\u00f3w klas, kt\u00f3re b\u0119dzie ewoluowa\u0107 razem z formatem plik\u00f3w klas. API to zapewnia:<\/p>\n","innerContent":["\n<p><strong>Solution<\/strong>: JEP 466 wprowadza standardowe API do obs\u0142ugi plik\u00f3w klas, kt\u00f3re b\u0119dzie ewoluowa\u0107 razem z formatem plik\u00f3w klas. API to zapewnia:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Niezmienno\u015b\u0107 obiekt\u00f3w reprezentuj\u0105cych elementy plik\u00f3w klas.<\/li>\n","innerContent":["\n<li>Niezmienno\u015b\u0107 obiekt\u00f3w reprezentuj\u0105cych elementy plik\u00f3w klas.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Struktur\u0119 drzewa, kt\u00f3ra odzwierciedla hierarchi\u0119 pliku klasy.<\/li>\n","innerContent":["\n<li>Struktur\u0119 drzewa, kt\u00f3ra odzwierciedla hierarchi\u0119 pliku klasy.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Nawigacj\u0119 sterowan\u0105 przez u\u017cytkownika, co pozwala na efektywne parsowanie tylko niezb\u0119dnych cz\u0119\u015bci pliku klasy.<\/li>\n","innerContent":["\n<li>Nawigacj\u0119 sterowan\u0105 przez u\u017cytkownika, co pozwala na efektywne parsowanie tylko niezb\u0119dnych cz\u0119\u015bci pliku klasy.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Lenistwo w parsowaniu, co zwi\u0119ksza efektywno\u015b\u0107.<\/li>\n","innerContent":["\n<li>Lenistwo w parsowaniu, co zwi\u0119ksza efektywno\u015b\u0107.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Zintegrowane widoki strumieniowe i materializowane.<\/li>\n","innerContent":["\n<li>Zintegrowane widoki strumieniowe i materializowane.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Transformacje jako operacje p\u0142askiego mapowania na strumieniach element\u00f3w.<\/li>\n","innerContent":["\n<li>Transformacje jako operacje p\u0142askiego mapowania na strumieniach element\u00f3w.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Ukrywanie szczeg\u00f3\u0142\u00f3w implementacyjnych, takich jak pula sta\u0142ych czy mapy stosu.<\/li>\n","innerContent":["\n<li>Ukrywanie szczeg\u00f3\u0142\u00f3w implementacyjnych, takich jak pula sta\u0142ych czy mapy stosu.<\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n\n\n\n\n\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>API Class-File ma jak wida\u0107 spory zakres i musi generowa\u0107 klasy zgodnie ze specyfikacj\u0105 Java Virtual Machine, dlatego wymaga znacz\u0105cych test\u00f3w jako\u015bci i zgodno\u015bci. W miar\u0119 zast\u0119powania u\u017cycia ASM w JDK przy u\u017cyciu API Class-File, wyniki b\u0119d\u0105 por\u00f3wnywane, aby wykry\u0107 regresje, a tak\u017ce przeprowadza\u0107 obszerne testy wydajno\u015bci.<\/p>\n","innerContent":["\n<p>API Class-File ma jak wida\u0107 spory zakres i musi generowa\u0107 klasy zgodnie ze specyfikacj\u0105 Java Virtual Machine, dlatego wymaga znacz\u0105cych test\u00f3w jako\u015bci i zgodno\u015bci. W miar\u0119 zast\u0119powania u\u017cycia ASM w JDK przy u\u017cyciu API Class-File, wyniki b\u0119d\u0105 por\u00f3wnywane, aby wykry\u0107 regresje, a tak\u017ce przeprowadza\u0107 obszerne testy wydajno\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jakie zmiany pojawi\u0142y si\u0119 od ostatniej wersji preview?<\/strong><\/p>\n","innerContent":["\n<p><strong>Jakie zmiany pojawi\u0142y si\u0119 od ostatniej wersji preview?<\/strong><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Uproszczono klas\u0119 <code>CodeBuilder<\/code>, usuwaj\u0105c metody \u015bredniego poziomu, kt\u00f3re dublowa\u0142y metody niskiego poziomu lub by\u0142y rzadko u\u017cywane.<\/li>\n","innerContent":["\n<li>Uproszczono klas\u0119 <code>CodeBuilder<\/code>, usuwaj\u0105c metody \u015bredniego poziomu, kt\u00f3re dublowa\u0142y metody niskiego poziomu lub by\u0142y rzadko u\u017cywane.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Udoskonalono klas\u0119 <code>ClassSignature<\/code>, aby dok\u0142adniej modelowa\u0142a sygnatury generyczne superklas i superinterfejs\u00f3w.<\/li>\n","innerContent":["\n<li>Udoskonalono klas\u0119 <code>ClassSignature<\/code>, aby dok\u0142adniej modelowa\u0142a sygnatury generyczne superklas i superinterfejs\u00f3w.<\/li>\n"]}],"innerHTML":"\n<ul>\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>**Alternatywy: ** Rozwa\u017cano alternatyw\u0119 polegaj\u0105c\u0105 na w\u0142\u0105czeniu ASM do JDK i przej\u0119ciu odpowiedzialno\u015bci za jego dalsze utrzymanie, ale uznano, \u017ce nie jest to w\u0142a\u015bciwe rozwi\u0105zanie. ASM to stara, legacy baza kodu i trudna do ewolucji, a priorytety projektowe, kt\u00f3re kierowa\u0142y jego architektur\u0105, mog\u0105 nie pasowa\u0107 do dzisiejszych reali\u00f3w.<\/p>\n","innerContent":["\n<p>**Alternatywy: ** Rozwa\u017cano alternatyw\u0119 polegaj\u0105c\u0105 na w\u0142\u0105czeniu ASM do JDK i przej\u0119ciu odpowiedzialno\u015bci za jego dalsze utrzymanie, ale uznano, \u017ce nie jest to w\u0142a\u015bciwe rozwi\u0105zanie. ASM to stara, legacy baza kodu i trudna do ewolucji, a priorytety projektowe, kt\u00f3re kierowa\u0142y jego architektur\u0105, mog\u0105 nie pasowa\u0107 do dzisiejszych reali\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu<\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu<\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Parsowanie plik\u00f3w klas za pomoc\u0105 wzorc\u00f3w:<\/strong><\/p>\n","innerContent":["\n<p><strong>Parsowanie plik\u00f3w klas za pomoc\u0105 wzorc\u00f3w:<\/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>CodeModel code = ...\nSet&lt;ClassDesc&gt; deps = new HashSet&lt;&gt;();\nfor (CodeElement e : code) {\n    switch (e) {\n        case FieldInstruction f  -&gt; deps.add(f.owner());\n        case InvokeInstruction i -&gt; deps.add(i.owner());\n        \/\/ ... and so on for instanceof, cast, etc ...\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>CodeModel code = ...\nSet&lt;ClassDesc&gt; deps = new HashSet&lt;&gt;();\nfor (CodeElement e : code) {\n    switch (e) {\n        case FieldInstruction f  -&gt; deps.add(f.owner());\n        case InvokeInstruction i -&gt; deps.add(i.owner());\n        \/\/ ... and so on for instanceof, cast, etc ...\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Generowanie plik\u00f3w klas za pomoc\u0105 builder\u00f3w:<\/strong><\/p>\n","innerContent":["\n<p><strong>Generowanie plik\u00f3w klas za pomoc\u0105 builder\u00f3w:<\/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>ClassBuilder classBuilder = ...;\nclassBuilder.withMethod(\"fooBar\", MethodTypeDesc.of(CD_void, CD_boolean, CD_int), flags,\n                        methodBuilder -&gt; methodBuilder.withCode(codeBuilder -&gt; {\n    Label label1 = codeBuilder.newLabel();\n    Label label2 = codeBuilder.newLabel();\n    codeBuilder.iload(1)\n        .ifeq(label1)\n        .aload(0)\n        .iload(2)\n        .invokevirtual(ClassDesc.of(\"Foo\"), \"foo\", MethodTypeDesc.of(CD_void, CD_int))\n        .goto_(label2)\n        .labelBinding(label1)\n        .aload(0)\n        .iload(2)\n        .invokevirtual(ClassDesc.of(\"Foo\"), \"bar\", MethodTypeDesc.of(CD_void, CD_int))\n        .labelBinding(label2)\n        .return_();\n});\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ClassBuilder classBuilder = ...;\nclassBuilder.withMethod(\"fooBar\", MethodTypeDesc.of(CD_void, CD_boolean, CD_int), flags,\n                        methodBuilder -&gt; methodBuilder.withCode(codeBuilder -&gt; {\n    Label label1 = codeBuilder.newLabel();\n    Label label2 = codeBuilder.newLabel();\n    codeBuilder.iload(1)\n        .ifeq(label1)\n        .aload(0)\n        .iload(2)\n        .invokevirtual(ClassDesc.of(\"Foo\"), \"foo\", MethodTypeDesc.of(CD_void, CD_int))\n        .goto_(label2)\n        .labelBinding(label1)\n        .aload(0)\n        .iload(2)\n        .invokevirtual(ClassDesc.of(\"Foo\"), \"bar\", MethodTypeDesc.of(CD_void, CD_int))\n        .labelBinding(label2)\n        .return_();\n});\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Transformacja plik\u00f3w klas:<\/strong><\/p>\n","innerContent":["\n<p><strong>Transformacja plik\u00f3w klas:<\/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>ClassFile cf = ClassFile.of();\nClassModel classModel = cf.parse(bytes);\nbyte&#91;] newBytes = cf.transform(classModel, (classBuilder, ce) -&gt; {\n    if (ce instanceof MethodModel mm) {\n        classBuilder.transformMethod(mm, (methodBuilder, me)-&gt; {\n            if (me instanceof CodeModel cm) {\n                methodBuilder.transformCode(cm, (codeBuilder, e) -&gt; {\n                    switch (e) {\n                        case InvokeInstruction i\n                                when i.owner().asInternalName().equals(\"Foo\") -&gt;\n                            codeBuilder.invoke(i.opcode(), ClassDesc.of(\"Bar\"), \n                                              i.name().stringValue(),\n                                              i.typeSymbol(), i.isInterface());\n                        default -&gt; codeBuilder.with(e);\n                    }\n                });\n            } else {\n                methodBuilder.with(me);\n            }\n        });\n    } else {\n        classBuilder.with(ce);\n    }\n});\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ClassFile cf = ClassFile.of();\nClassModel classModel = cf.parse(bytes);\nbyte&#91;] newBytes = cf.transform(classModel, (classBuilder, ce) -&gt; {\n    if (ce instanceof MethodModel mm) {\n        classBuilder.transformMethod(mm, (methodBuilder, me)-&gt; {\n            if (me instanceof CodeModel cm) {\n                methodBuilder.transformCode(cm, (codeBuilder, e) -&gt; {\n                    switch (e) {\n                        case InvokeInstruction i\n                                when i.owner().asInternalName().equals(\"Foo\") -&gt;\n                            codeBuilder.invoke(i.opcode(), ClassDesc.of(\"Bar\"), \n                                              i.name().stringValue(),\n                                              i.typeSymbol(), i.isInterface());\n                        default -&gt; codeBuilder.with(e);\n                    }\n                });\n            } else {\n                methodBuilder.with(me);\n            }\n        });\n    } else {\n        classBuilder.with(ce);\n    }\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\/473\">473: Stream Gatherers (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/473\">473: Stream Gatherers (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18212,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-5-1024x585.png\" alt=\"\" class=\"wp-image-18212\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-5-1024x585.png\" alt=\"\" class=\"wp-image-18212\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 473 proponuje ulepszenie API Stream, aby obs\u0142ugiwa\u0142o niestandardowe operacje po\u015brednie, umo\u017cliwiaj\u0105c bardziej elastyczne przetwarzanie strumieni.<\/p>\n","innerContent":["\n<p>JEP 473 proponuje ulepszenie API Stream, aby obs\u0142ugiwa\u0142o niestandardowe operacje po\u015brednie, umo\u017cliwiaj\u0105c bardziej elastyczne przetwarzanie strumieni.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?:<\/strong> Obecne API Stream oferuje sta\u0142y zestaw operacji po\u015brednich, kt\u00f3re nie zawsze umo\u017cliwiaj\u0105 realizacj\u0119 bardziej z\u0142o\u017conych zada\u0144. Brak mo\u017cliwo\u015bci definiowania niestandardowych operacji po\u015brednich ogranicza elastyczno\u015b\u0107 i ekspresyjno\u015b\u0107 kodu, zw\u0142aszcza w przypadku zada\u0144, kt\u00f3re wymagaj\u0105 specyficznej logiki transformacji danych.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?:<\/strong> Obecne API Stream oferuje sta\u0142y zestaw operacji po\u015brednich, kt\u00f3re nie zawsze umo\u017cliwiaj\u0105 realizacj\u0119 bardziej z\u0142o\u017conych zada\u0144. Brak mo\u017cliwo\u015bci definiowania niestandardowych operacji po\u015brednich ogranicza elastyczno\u015b\u0107 i ekspresyjno\u015b\u0107 kodu, zw\u0142aszcza w przypadku zada\u0144, kt\u00f3re wymagaj\u0105 specyficznej logiki transformacji danych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution<\/strong>: JEP 473 wprowadza now\u0105 operacj\u0119 po\u015bredni\u0105 <code>Stream::gather(Gatherer)<\/code>, kt\u00f3ra umo\u017cliwia przetwarzanie element\u00f3w strumienia przy u\u017cyciu zdefiniowanych przez u\u017cytkownika tzw. gatherer\u00f3w. Gatherer to instancja interfejsu <code>java.util.stream.Gatherer<\/code>, kt\u00f3ra reprezentuje transformacj\u0119 element\u00f3w strumienia i umo\u017cliwia manipulacj\u0119 strumieniami o niesko\u0144czonej wielko\u015bci.<\/p>\n","innerContent":["\n<p><strong>Solution<\/strong>: JEP 473 wprowadza now\u0105 operacj\u0119 po\u015bredni\u0105 <code>Stream::gather(Gatherer)<\/code>, kt\u00f3ra umo\u017cliwia przetwarzanie element\u00f3w strumienia przy u\u017cyciu zdefiniowanych przez u\u017cytkownika tzw. gatherer\u00f3w. Gatherer to instancja interfejsu <code>java.util.stream.Gatherer<\/code>, kt\u00f3ra reprezentuje transformacj\u0119 element\u00f3w strumienia i umo\u017cliwia manipulacj\u0119 strumieniami o niesko\u0144czonej wielko\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jakie zmiany pojawi\u0142y si\u0119 od ostatniej wersji preview?<\/strong>: Nie wprowadzono \u017cadnych zmian w por\u00f3wnaniu do poprzedniej wersji preview (JEP 461). Celem jest zebranie dodatkowych opinii i do\u015bwiadcze\u0144 z u\u017cytkowania tego API.<\/p>\n","innerContent":["\n<p><strong>Jakie zmiany pojawi\u0142y si\u0119 od ostatniej wersji preview?<\/strong>: Nie wprowadzono \u017cadnych zmian w por\u00f3wnaniu do poprzedniej wersji preview (JEP 461). Celem jest zebranie dodatkowych opinii i do\u015bwiadcze\u0144 z u\u017cytkowania tego API.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Grupowanie element\u00f3w w sta\u0142e okna:<\/strong><\/p>\n","innerContent":["\n<p><strong>Grupowanie element\u00f3w w sta\u0142e okna:<\/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>var result = Stream.iterate(0, i -&gt; i + 1)\n                   .gather(Gatherers.windowFixed(3))\n                   .limit(2)\n                   .toList();\n\n\/\/ result ==&gt; &#91;&#91;0, 1, 2], &#91;3, 4, 5]]\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>var result = Stream.iterate(0, i -&gt; i + 1)\n                   .gather(Gatherers.windowFixed(3))\n                   .limit(2)\n                   .toList();\n\n\/\/ result ==&gt; &#91;&#91;0, 1, 2], &#91;3, 4, 5]]\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Definiowanie niestandardowego gatherera:<\/strong><\/p>\n","innerContent":["\n<p><strong>Definiowanie niestandardowego gatherera:<\/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>record WindowFixed&lt;TR&gt;(int windowSize)\n    implements Gatherer&lt;TR, ArrayList&lt;TR&gt;, List&lt;TR&gt;&gt; {\n\n    public WindowFixed {\n        if (windowSize &lt; 1) {\n            throw new IllegalArgumentException(\"window size must be positive\");\n        }\n    }\n\n    @Override\n    public Supplier&lt;ArrayList&lt;TR&gt;&gt; initializer() {\n        return () -&gt; new ArrayList&lt;&gt;(windowSize);\n    }\n\n    @Override\n    public Integrator&lt;ArrayList&lt;TR&gt;, TR, List&lt;TR&gt;&gt; integrator() {\n        return Gatherer.Integrator.ofGreedy((window, element, downstream) -&gt; {\n            window.add(element);\n            if (window.size() &lt; windowSize) {\n                return true;\n            }\n            var result = new ArrayList&lt;TR&gt;(window);\n            window.clear();\n            return downstream.push(result);\n        });\n    }\n\n    @Override\n    public BiConsumer&lt;ArrayList&lt;TR&gt;, Downstream&lt;? super List&lt;TR&gt;&gt;&gt; finisher() {\n        return (window, downstream) -&gt; {\n            if (!downstream.isRejecting() &amp;&amp; !window.isEmpty()) {\n                downstream.push(new ArrayList&lt;TR&gt;(window));\n                window.clear();\n            }\n        };\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>record WindowFixed&lt;TR&gt;(int windowSize)\n    implements Gatherer&lt;TR, ArrayList&lt;TR&gt;, List&lt;TR&gt;&gt; {\n\n    public WindowFixed {\n        if (windowSize &lt; 1) {\n            throw new IllegalArgumentException(\"window size must be positive\");\n        }\n    }\n\n    @Override\n    public Supplier&lt;ArrayList&lt;TR&gt;&gt; initializer() {\n        return () -&gt; new ArrayList&lt;&gt;(windowSize);\n    }\n\n    @Override\n    public Integrator&lt;ArrayList&lt;TR&gt;, TR, List&lt;TR&gt;&gt; integrator() {\n        return Gatherer.Integrator.ofGreedy((window, element, downstream) -&gt; {\n            window.add(element);\n            if (window.size() &lt; windowSize) {\n                return true;\n            }\n            var result = new ArrayList&lt;TR&gt;(window);\n            window.clear();\n            return downstream.push(result);\n        });\n    }\n\n    @Override\n    public BiConsumer&lt;ArrayList&lt;TR&gt;, Downstream&lt;? super List&lt;TR&gt;&gt;&gt; finisher() {\n        return (window, downstream) -&gt; {\n            if (!downstream.isRejecting() &amp;&amp; !window.isEmpty()) {\n                downstream.push(new ArrayList&lt;TR&gt;(window));\n                window.clear();\n            }\n        };\n    }\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\/476\">476: Module Import Declarations (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/476\">476: Module Import Declarations (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18214,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-6-1024x585.png\" alt=\"\" class=\"wp-image-18214\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-6-1024x585.png\" alt=\"\" class=\"wp-image-18214\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 476 wprowadza mo\u017cliwo\u015b\u0107 importowania wszystkich pakiet\u00f3w eksportowanych przez modu\u0142 za pomoc\u0105 nowej deklaracji <code>import module<\/code>. U\u0142atwia to ponowne wykorzystanie bibliotek modularnych bez konieczno\u015bci modularizacji w\u0142asnego kodu.<\/p>\n","innerContent":["\n<p>JEP 476 wprowadza mo\u017cliwo\u015b\u0107 importowania wszystkich pakiet\u00f3w eksportowanych przez modu\u0142 za pomoc\u0105 nowej deklaracji <code>import module<\/code>. U\u0142atwia to ponowne wykorzystanie bibliotek modularnych bez konieczno\u015bci modularizacji w\u0142asnego kodu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>**Jaki jest problem?: ** Obecnie programi\u015bci w wypadku u\u017cywania modu\u0142\u00f3w musz\u0105 r\u0119cznie importowa\u0107 wiele pakiet\u00f3w, co mo\u017ce by\u0107 czasoch\u0142onne i skomplikowane, zw\u0142aszcza dla pocz\u0105tkuj\u0105cych u\u017cytkownik\u00f3w. Brak mo\u017cliwo\u015bci prostego importowania ca\u0142ych modu\u0142\u00f3w prowadzi do redundancji i z\u0142o\u017cono\u015bci kodu.<\/p>\n","innerContent":["\n<p>**Jaki jest problem?: ** Obecnie programi\u015bci w wypadku u\u017cywania modu\u0142\u00f3w musz\u0105 r\u0119cznie importowa\u0107 wiele pakiet\u00f3w, co mo\u017ce by\u0107 czasoch\u0142onne i skomplikowane, zw\u0142aszcza dla pocz\u0105tkuj\u0105cych u\u017cytkownik\u00f3w. Brak mo\u017cliwo\u015bci prostego importowania ca\u0142ych modu\u0142\u00f3w prowadzi do redundancji i z\u0142o\u017cono\u015bci kodu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>**Jak proposal rozwi\u0105zuje ten problem?: ** JEP 476 wprowadza now\u0105 deklaracj\u0119 <code>import module<\/code>, kt\u00f3ra pozwala importowa\u0107 wszystkie publiczne klasy i interfejsy z pakiet\u00f3w eksportowanych przez dany modu\u0142 oraz modu\u0142y, kt\u00f3re s\u0105 przez niego transitively wymagane. Dzi\u0119ki temu programi\u015bci mog\u0105 \u0142atwiej i szybciej uzyska\u0107 dost\u0119p do potrzebnych zasob\u00f3w, co upraszcza kod i zmniejsza liczb\u0119 deklaracji importu.<\/p>\n","innerContent":["\n<p>**Jak proposal rozwi\u0105zuje ten problem?: ** JEP 476 wprowadza now\u0105 deklaracj\u0119 <code>import module<\/code>, kt\u00f3ra pozwala importowa\u0107 wszystkie publiczne klasy i interfejsy z pakiet\u00f3w eksportowanych przez dany modu\u0142 oraz modu\u0142y, kt\u00f3re s\u0105 przez niego transitively wymagane. Dzi\u0119ki temu programi\u015bci mog\u0105 \u0142atwiej i szybciej uzyska\u0107 dost\u0119p do potrzebnych zasob\u00f3w, co upraszcza kod i zmniejsza liczb\u0119 deklaracji importu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nie ma jednak r\u00f3\u017cy bez kolc\u00f3w - u\u017cycie wielu deklaracji <code>import module<\/code> mo\u017ce prowadzi\u0107 do ryzyka konflikt\u00f3w nazw, kt\u00f3re zostan\u0105 wykryte dopiero podczas kompilacji. Rozwi\u0105zanie tych konflikt\u00f3w mo\u017ce wymaga\u0107 dodania pojedynczych deklaracji importu typu, co mo\u017ce by\u0107 uci\u0105\u017cliwe i prowadzi\u0107 do trudno\u015bci w utrzymaniu kodu.<\/p>\n","innerContent":["\n<p>Nie ma jednak r\u00f3\u017cy bez kolc\u00f3w - u\u017cycie wielu deklaracji <code>import module<\/code> mo\u017ce prowadzi\u0107 do ryzyka konflikt\u00f3w nazw, kt\u00f3re zostan\u0105 wykryte dopiero podczas kompilacji. Rozwi\u0105zanie tych konflikt\u00f3w mo\u017ce wymaga\u0107 dodania pojedynczych deklaracji importu typu, co mo\u017ce by\u0107 uci\u0105\u017cliwe i prowadzi\u0107 do trudno\u015bci w utrzymaniu kodu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":4},"innerBlocks":[],"innerHTML":"\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n","innerContent":["\n<h4 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h4>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Importowanie ca\u0142ego modu\u0142u:<\/strong><\/p>\n","innerContent":["\n<p><strong>Importowanie ca\u0142ego modu\u0142u:<\/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>import module java.base;\n\nString&#91;] fruits = new String&#91;] { \"apple\", \"berry\", \"citrus\" };\nMap&lt;String, String&gt; m = \n    Stream.of(fruits)\n          .collect(Collectors.toMap(\n              s -&gt; s.toUpperCase().substring(0,1), \n            Function.identity()));\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>import module java.base;\n\nString&#91;] fruits = new String&#91;] { \"apple\", \"berry\", \"citrus\" };\nMap&lt;String, String&gt; m = \n    Stream.of(fruits)\n          .collect(Collectors.toMap(\n              s -&gt; s.toUpperCase().substring(0,1), \n            Function.identity()));\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Rozwi\u0105zywanie konflikt\u00f3w nazw:<\/strong><\/p>\n","innerContent":["\n<p><strong>Rozwi\u0105zywanie konflikt\u00f3w nazw:<\/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>import module java.base;\nimport module java.sql;\nimport java.sql.Date;\n\nDate d = ... \/\/ Ok! Date jest rozpoznane jako java.sql.Date\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>import module java.base;\nimport module java.sql;\nimport java.sql.Date;\n\nDate d = ... \/\/ Ok! Date jest rozpoznane jako java.sql.Date\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\/477\">477: Implicitly Declared Classes and Instance Main Methods (Third Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/477\">477: Implicitly Declared Classes and Instance Main Methods (Third Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18216,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-7-1024x585.png\" alt=\"\" class=\"wp-image-18216\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-7-1024x585.png\" alt=\"\" class=\"wp-image-18216\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 477 ma na celu uproszczenie pisania pierwszych program\u00f3w w j\u0119zyku Java, umo\u017cliwiaj\u0105c programistom tworzenie program\u00f3w bez potrzeby zrozumienia zaawansowanych konstrukcji j\u0119zykowych przeznaczonych do du\u017cych program\u00f3w. Funkcja ta wprowadza mo\u017cliwo\u015b\u0107 deklarowania klas implicit i metod main instancji, co pozwala na bardziej zwi\u0119z\u0142e pisanie ma\u0142ych program\u00f3w.<\/p>\n","innerContent":["\n<p>JEP 477 ma na celu uproszczenie pisania pierwszych program\u00f3w w j\u0119zyku Java, umo\u017cliwiaj\u0105c programistom tworzenie program\u00f3w bez potrzeby zrozumienia zaawansowanych konstrukcji j\u0119zykowych przeznaczonych do du\u017cych program\u00f3w. Funkcja ta wprowadza mo\u017cliwo\u015b\u0107 deklarowania klas implicit i metod main instancji, co pozwala na bardziej zwi\u0119z\u0142e pisanie ma\u0142ych program\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?:<\/strong> Obecnie pocz\u0105tkuj\u0105cy programi\u015bci musz\u0105 zrozumie\u0107 wiele z\u0142o\u017conych konstrukcji j\u0119zykowych, takich jak klasy, pakiety, modu\u0142y, modyfikatory dost\u0119pu i statyczne, zanim b\u0119d\u0105 mogli napisa\u0107 prosty program. To mo\u017ce zniech\u0119ca\u0107 nowych u\u017cytkownik\u00f3w i utrudnia\u0107 nauk\u0119.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?:<\/strong> Obecnie pocz\u0105tkuj\u0105cy programi\u015bci musz\u0105 zrozumie\u0107 wiele z\u0142o\u017conych konstrukcji j\u0119zykowych, takich jak klasy, pakiety, modu\u0142y, modyfikatory dost\u0119pu i statyczne, zanim b\u0119d\u0105 mogli napisa\u0107 prosty program. To mo\u017ce zniech\u0119ca\u0107 nowych u\u017cytkownik\u00f3w i utrudnia\u0107 nauk\u0119.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution:<\/strong> JEP 477 upraszcza tworzenie program\u00f3w wprowadzaj\u0105c:<\/p>\n","innerContent":["\n<p><strong>Solution:<\/strong> JEP 477 upraszcza tworzenie program\u00f3w wprowadzaj\u0105c:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":{"ordered":true},"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><strong>Instancyjne metody main<\/strong>: Metody main nie musz\u0105 by\u0107 statyczne, publiczne ani przyjmowa\u0107 parametru <code>String[]<\/code>.<\/li>\n","innerContent":["\n<li><strong>Instancyjne metody main<\/strong>: Metody main nie musz\u0105 by\u0107 statyczne, publiczne ani przyjmowa\u0107 parametru <code>String[]<\/code>.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><strong>Implicitne klasy<\/strong>: Pozwala to na pisanie metod i p\u00f3l na najwy\u017cszym poziomie, kt\u00f3re s\u0105 automatycznie zawierane w ukrytej klasie.<\/li>\n","innerContent":["\n<li><strong>Implicitne klasy<\/strong>: Pozwala to na pisanie metod i p\u00f3l na najwy\u017cszym poziomie, kt\u00f3re s\u0105 automatycznie zawierane w ukrytej klasie.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><strong>Automatyczny import metod I\/O<\/strong>: Metody do prostego wej\u015bcia\/wyj\u015bcia tekstowego s\u0105 automatycznie importowane.<\/li>\n","innerContent":["\n<li><strong>Automatyczny import metod I\/O<\/strong>: Metody do prostego wej\u015bcia\/wyj\u015bcia tekstowego s\u0105 automatycznie importowane.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><strong>Automatyczny import modu\u0142u java.base<\/strong>: Wszystkie publiczne klasy i interfejsy pakiet\u00f3w eksportowanych przez modu\u0142 java.base s\u0105 automatycznie importowane.<\/li>\n","innerContent":["\n<li><strong>Automatyczny import modu\u0142u java.base<\/strong>: Wszystkie publiczne klasy i interfejsy pakiet\u00f3w eksportowanych przez modu\u0142 java.base s\u0105 automatycznie importowane.<\/li>\n"]}],"innerHTML":"\n<ol>\n\n\n\n\n\n<\/ol>\n","innerContent":["\n<ol>",null,"\n\n",null,"\n\n",null,"\n\n",null,"<\/ol>\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\">Przyk\u0142ad kodu:<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Prosty program \"Hello, World!\" w implicitnej klasie:<\/strong><\/p>\n","innerContent":["\n<p><strong>Prosty program \"Hello, World!\" w implicitnej klasie:<\/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    println(\"Hello, World!\");\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>void main() {\n    println(\"Hello, World!\");\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Program interaktywny:<\/strong><\/p>\n","innerContent":["\n<p><strong>Program interaktywny:<\/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    String name = readln(\"Please enter your name: \");\n    print(\"Pleased to meet you, \");\n    println(name);\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>void main() {\n    String name = readln(\"Please enter your name: \");\n    print(\"Pleased to meet you, \");\n    println(name);\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\/480\">480: Structured Concurrency (Third Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/480\">480: Structured Concurrency (Third Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18218,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-8-1024x585.png\" alt=\"\" class=\"wp-image-18218\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-8-1024x585.png\" alt=\"\" class=\"wp-image-18218\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 480 wprowadza API do strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, upraszczaj\u0105c programowanie wsp\u00f3\u0142bie\u017cne poprzez traktowanie grup powi\u0105zanych zada\u0144 jako jednej \"jednostki pracy\". Strukturalna wsp\u00f3\u0142bie\u017cno\u015b\u0107 poprawia obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i u\u0142atwia anulowanie zada\u0144, dodatkowo zapewniaj\u0105c obserwowalno\u015b\u0107 kodu wsp\u00f3\u0142bie\u017cnego.<\/p>\n","innerContent":["\n<p>JEP 480 wprowadza API do strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, upraszczaj\u0105c programowanie wsp\u00f3\u0142bie\u017cne poprzez traktowanie grup powi\u0105zanych zada\u0144 jako jednej \"jednostki pracy\". Strukturalna wsp\u00f3\u0142bie\u017cno\u015b\u0107 poprawia obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i u\u0142atwia anulowanie zada\u0144, dodatkowo zapewniaj\u0105c obserwowalno\u015b\u0107 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>Jaki jest problem?<\/strong>: Obecne podej\u015bcie do wsp\u00f3\u0142bie\u017cno\u015bci, oparte na ExecutorService i Future, pozwala na nieograniczone \u017cadnymi logicznymi zakresami wzorce wsp\u00f3\u0142bie\u017cno\u015bci, co prowadzi do problem\u00f3w z zarz\u0105dzaniem \u017cyciem w\u0105tk\u00f3w, obs\u0142ug\u0105 b\u0142\u0119d\u00f3w i propagacj\u0105 anulowania. To sprawia, \u017ce kod jest trudniejszy do zrozumienia, debugowania i utrzymania.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?<\/strong>: Obecne podej\u015bcie do wsp\u00f3\u0142bie\u017cno\u015bci, oparte na ExecutorService i Future, pozwala na nieograniczone \u017cadnymi logicznymi zakresami wzorce wsp\u00f3\u0142bie\u017cno\u015bci, co prowadzi do problem\u00f3w z zarz\u0105dzaniem \u017cyciem w\u0105tk\u00f3w, obs\u0142ug\u0105 b\u0142\u0119d\u00f3w i propagacj\u0105 anulowania. To sprawia, \u017ce kod jest trudniejszy do zrozumienia, debugowania i utrzymania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> JEP 480 wprowadza API do strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, kt\u00f3re zapewnia hierarchiczne relacje mi\u0119dzy zadaniami i ich podzadaniami, podobnie jak stos wywo\u0142a\u0144 w standardowym kodzie. <code>StructuredTaskScope<\/code>, g\u0142\u00f3wna klasa API, umo\u017cliwia programistom grupowanie powi\u0105zanych zada\u0144, zarz\u0105dzanie nimi jako jedn\u0105 jednostk\u0105 oraz automatyczn\u0105 propagacj\u0119 anulowania i obs\u0142ug\u0119 b\u0142\u0119d\u00f3w. Zwi\u0119ksza te\u017c observability - narz\u0119dzia tego typu mog\u0105 bowiem wy\u015bwietla\u0107 hierarchi\u0119 zada\u0144, co u\u0142atwia diagnozowanie problem\u00f3w<\/p>\n","innerContent":["\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> JEP 480 wprowadza API do strukturalnej wsp\u00f3\u0142bie\u017cno\u015bci, kt\u00f3re zapewnia hierarchiczne relacje mi\u0119dzy zadaniami i ich podzadaniami, podobnie jak stos wywo\u0142a\u0144 w standardowym kodzie. <code>StructuredTaskScope<\/code>, g\u0142\u00f3wna klasa API, umo\u017cliwia programistom grupowanie powi\u0105zanych zada\u0144, zarz\u0105dzanie nimi jako jedn\u0105 jednostk\u0105 oraz automatyczn\u0105 propagacj\u0119 anulowania i obs\u0142ug\u0119 b\u0142\u0119d\u00f3w. Zwi\u0119ksza te\u017c observability - narz\u0119dzia tego typu mog\u0105 bowiem wy\u015bwietla\u0107 hierarchi\u0119 zada\u0144, co u\u0142atwia diagnozowanie problem\u00f3w<\/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\">Przyk\u0142ad kodu:<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Przyk\u0142ad kodu:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>U\u017cycie StructuredTaskScope w metodzie handle:<\/strong><\/p>\n","innerContent":["\n<p><strong>U\u017cycie StructuredTaskScope w metodzie handle:<\/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&lt;String&gt;  user  = scope.fork(() -&gt; findUser());\n        Supplier&lt;Integer&gt; order = scope.fork(() -&gt; fetchOrder());\n\n        scope.join()            \/\/ Do\u0142\u0105cz do obu podzada\u0144\n             .throwIfFailed();  \/\/ Propaguj b\u0142\u0119dy\n\n        \/\/ Tutaj oba podzadania zako\u0144czy\u0142y si\u0119 sukcesem, wi\u0119c komponuj ich wyniki\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&lt;String&gt;  user  = scope.fork(() -&gt; findUser());\n        Supplier&lt;Integer&gt; order = scope.fork(() -&gt; fetchOrder());\n\n        scope.join()            \/\/ Do\u0142\u0105cz do obu podzada\u0144\n             .throwIfFailed();  \/\/ Propaguj b\u0142\u0119dy\n\n        \/\/ Tutaj oba podzadania zako\u0144czy\u0142y si\u0119 sukcesem, wi\u0119c komponuj ich wyniki\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\/481\">481: Scoped Values (Third Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/481\">481: Scoped Values (Third Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18220,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-18220\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-18220\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 481 wprowadza warto\u015bci zakresowe (scoped values), kt\u00f3re umo\u017cliwiaj\u0105 metodzie dzielenie si\u0119 niemutowalnymi danymi zar\u00f3wno z wywo\u0142aniami wewn\u0105trz w\u0105tku, jak i z w\u0105tkami potomnymi.<\/p>\n","innerContent":["\n<p>JEP 481 wprowadza warto\u015bci zakresowe (scoped values), kt\u00f3re umo\u017cliwiaj\u0105 metodzie dzielenie si\u0119 niemutowalnymi danymi zar\u00f3wno z wywo\u0142aniami wewn\u0105trz w\u0105tku, jak i z w\u0105tkami potomnymi.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>**Solution: ** Zmienne lokalne w\u0105tku (ThreadLocal) s\u0105 trudne do zarz\u0105dzania i maj\u0105 problemy z mutowalno\u015bci\u0105, nieograniczon\u0105 \u017cywotno\u015bci\u0105 oraz kosztownym dziedziczeniem. Te problemy staj\u0105 si\u0119 jeszcze bardziej widoczne przy korzystaniu z du\u017cej liczby w\u0105tk\u00f3w wirtualnych.<\/p>\n","innerContent":["\n<p>**Solution: ** Zmienne lokalne w\u0105tku (ThreadLocal) s\u0105 trudne do zarz\u0105dzania i maj\u0105 problemy z mutowalno\u015bci\u0105, nieograniczon\u0105 \u017cywotno\u015bci\u0105 oraz kosztownym dziedziczeniem. Te problemy staj\u0105 si\u0119 jeszcze bardziej widoczne przy korzystaniu z du\u017cej liczby w\u0105tk\u00f3w wirtualnych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> JEP 481 wprowadza warto\u015bci zakresowe jako bezpieczny i wydajny spos\u00f3b na dzielenie danych mi\u0119dzy metodami w tym samym w\u0105tku oraz z w\u0105tkami potomnymi. S\u0105 one niemutowalne, a ich ograniczona \u017cywotno\u015b\u0107 sprawia, \u017ce s\u0105 dost\u0119pne tylko przez okre\u015blony czas podczas wykonywania w\u0105tku, co upraszcza zarz\u0105dzanie i poprawia wydajno\u015b\u0107. Mog\u0105 by\u0107 r\u00f3wnie\u017c dziedziczone przez w\u0105tki potomne tworzone przez <code>StructuredTaskScope<\/code>.<\/p>\n","innerContent":["\n<p><strong>Jak proposal rozwi\u0105zuje ten problem?:<\/strong> JEP 481 wprowadza warto\u015bci zakresowe jako bezpieczny i wydajny spos\u00f3b na dzielenie danych mi\u0119dzy metodami w tym samym w\u0105tku oraz z w\u0105tkami potomnymi. S\u0105 one niemutowalne, a ich ograniczona \u017cywotno\u015b\u0107 sprawia, \u017ce s\u0105 dost\u0119pne tylko przez okre\u015blony czas podczas wykonywania w\u0105tku, co upraszcza zarz\u0105dzanie i poprawia wydajno\u015b\u0107. Mog\u0105 by\u0107 r\u00f3wnie\u017c dziedziczone przez w\u0105tki potomne tworzone przez <code>StructuredTaskScope<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Scoped Values cechuje \u0142atwo\u015b\u0107 u\u017cycia, oferuj\u0105c prosty spos\u00f3b na przekazywanie danych mi\u0119dzy metodami, oraz przejrzysto\u015b\u0107, gdy\u017c \u017cywotno\u015b\u0107 udost\u0119pnianych danych jest wyra\u017anie widoczna w strukturze kodu. S\u0105 one \u0142atwiejsze do zrozumienia ni\u017c zmienne lokalne w\u0105tku i maj\u0105 ni\u017csze koszty pami\u0119ci i czasu, szczeg\u00f3lnie gdy s\u0105 u\u017cywane razem z w\u0105tkami wirtualnymi (JEP 444) i zorganizowan\u0105 wsp\u00f3\u0142bie\u017cno\u015bci\u0105 (JEP 480).<\/p>\n","innerContent":["\n<p>Scoped Values cechuje \u0142atwo\u015b\u0107 u\u017cycia, oferuj\u0105c prosty spos\u00f3b na przekazywanie danych mi\u0119dzy metodami, oraz przejrzysto\u015b\u0107, gdy\u017c \u017cywotno\u015b\u0107 udost\u0119pnianych danych jest wyra\u017anie widoczna w strukturze kodu. S\u0105 one \u0142atwiejsze do zrozumienia ni\u017c zmienne lokalne w\u0105tku i maj\u0105 ni\u017csze koszty pami\u0119ci i czasu, szczeg\u00f3lnie gdy s\u0105 u\u017cywane razem z w\u0105tkami wirtualnymi (JEP 444) i zorganizowan\u0105 wsp\u00f3\u0142bie\u017cno\u015bci\u0105 (JEP 480).<\/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 warto\u015bci zakresowych w frameworku webowym:<\/strong><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad u\u017cycia warto\u015bci zakresowych w frameworku webowym:<\/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 Framework {\n\n    private final static ScopedValue&lt;FrameworkContext&gt; CONTEXT\n                        = ScopedValue.newInstance();\n\n    void serve(Request request, Response response) {\n        var context = createContext(request);\n        ScopedValue.runWhere(CONTEXT, context,         \n                   () -&gt; Application.handle(request, response));\n    }\n    \n    public PersistedObject readKey(String key) {\n        var context = CONTEXT.get();                   \n        var db = getDBConnection(context);\n        db.readKey(key);\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class Framework {\n\n    private final static ScopedValue&lt;FrameworkContext&gt; CONTEXT\n                        = ScopedValue.newInstance();\n\n    void serve(Request request, Response response) {\n        var context = createContext(request);\n        ScopedValue.runWhere(CONTEXT, context,         \n                   () -&gt; Application.handle(request, response));\n    }\n    \n    public PersistedObject readKey(String key) {\n        var context = CONTEXT.get();                   \n        var db = getDBConnection(context);\n        db.readKey(key);\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 <code>CONTEXT<\/code> jest warto\u015bci\u0105 zakresow\u0105, kt\u00f3ra jest ustawiana w metodzie <code>serve<\/code> i dost\u0119pna w metodzie <code>readKey<\/code>.<\/p>\n","innerContent":["\n<p>W tym przyk\u0142adzie <code>CONTEXT<\/code> jest warto\u015bci\u0105 zakresow\u0105, kt\u00f3ra jest ustawiana w metodzie <code>serve<\/code> i dost\u0119pna w metodzie <code>readKey<\/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\/482\">482: Flexible Constructor Bodies (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/482\">482: Flexible Constructor Bodies (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18222,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-10-1024x585.png\" alt=\"\" class=\"wp-image-18222\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-10-1024x585.png\" alt=\"\" class=\"wp-image-18222\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 482 wprowadza mo\u017cliwo\u015b\u0107 umieszczania instrukcji w konstruktorach przed wywo\u0142aniem innego konstruktora (<code>super(..)<\/code> lub <code>this(..)<\/code>) w j\u0119zyku Java. Instrukcje te nie mog\u0105 odwo\u0142ywa\u0107 si\u0119 do tworzonej instancji, ale mog\u0105 inicjalizowa\u0107 jej pola.<\/p>\n","innerContent":["\n<p>JEP 482 wprowadza mo\u017cliwo\u015b\u0107 umieszczania instrukcji w konstruktorach przed wywo\u0142aniem innego konstruktora (<code>super(..)<\/code> lub <code>this(..)<\/code>) w j\u0119zyku Java. Instrukcje te nie mog\u0105 odwo\u0142ywa\u0107 si\u0119 do tworzonej instancji, ale mog\u0105 inicjalizowa\u0107 jej pola.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Jaki jest problem?<\/strong>: W j\u0119zyku Java konstruktor musi zaczyna\u0107 si\u0119 od wywo\u0142ania innego konstruktora (<code>super(..)<\/code> lub <code>this(..)<\/code>). To ograniczenie uniemo\u017cliwia umieszczanie kodu inicjalizacyjnego przed wywo\u0142aniem konstruktora nadklasy, co mo\u017ce prowadzi\u0107 do problem\u00f3w z nadpisywaniem metod i inicjalizacj\u0105 p\u00f3l.<\/p>\n","innerContent":["\n<p><strong>Jaki jest problem?<\/strong>: W j\u0119zyku Java konstruktor musi zaczyna\u0107 si\u0119 od wywo\u0142ania innego konstruktora (<code>super(..)<\/code> lub <code>this(..)<\/code>). To ograniczenie uniemo\u017cliwia umieszczanie kodu inicjalizacyjnego przed wywo\u0142aniem konstruktora nadklasy, co mo\u017ce prowadzi\u0107 do problem\u00f3w z nadpisywaniem metod i inicjalizacj\u0105 p\u00f3l.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution<\/strong>: JEP 482 wprowadza zmiany do gramatyki konstruktor\u00f3w, pozwalaj\u0105c na umieszczanie instrukcji przed wywo\u0142aniem konstruktora. Kod ten mo\u017ce inicjalizowa\u0107 pola, ale nie mo\u017ce odwo\u0142ywa\u0107 si\u0119 do tworzonej instancji. Dzi\u0119ki temu klasa jest bardziej niezawodna, gdy metody s\u0105 nadpisywane.<\/p>\n","innerContent":["\n<p><strong>Solution<\/strong>: JEP 482 wprowadza zmiany do gramatyki konstruktor\u00f3w, pozwalaj\u0105c na umieszczanie instrukcji przed wywo\u0142aniem konstruktora. Kod ten mo\u017ce inicjalizowa\u0107 pola, ale nie mo\u017ce odwo\u0142ywa\u0107 si\u0119 do tworzonej instancji. Dzi\u0119ki temu klasa jest bardziej niezawodna, gdy metody s\u0105 nadpisywane.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Przyk\u0142ad weryfikacji argument\u00f3w konstruktora przed wywo\u0142aniem konstruktora nadklasy:<\/strong><\/p>\n","innerContent":["\n<p><strong>Przyk\u0142ad weryfikacji argument\u00f3w konstruktora przed wywo\u0142aniem konstruktora nadklasy:<\/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>public class PositiveBigInteger extends BigInteger {\n\n    public PositiveBigInteger(long value) {\n        if (value &lt;= 0) throw new IllegalArgumentException(..);\n        super(value);\n    }}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>public class PositiveBigInteger extends BigInteger {\n\n    public PositiveBigInteger(long value) {\n        if (value &lt;= 0) throw new IllegalArgumentException(..);\n        super(value);\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 argument <code>value<\/code> jest weryfikowany przed wywo\u0142aniem konstruktora nadklasy <code>BigInteger<\/code>.<\/p>\n","innerContent":["\n<p>W tym przyk\u0142adzie argument <code>value<\/code> jest weryfikowany przed wywo\u0142aniem konstruktora nadklasy <code>BigInteger<\/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":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Incubation<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Incubation<\/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\/469\">469: Vector API (Eighth Incubator)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/469\">469: Vector API (Eighth Incubator)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":18224,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11-1024x580.png\" alt=\"\" class=\"wp-image-18224\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/06\/image-11-1024x580.png\" alt=\"\" class=\"wp-image-18224\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 469 rozszerza API, kt\u00f3re umo\u017cliwia wyra\u017canie oblicze\u0144 wektorowych, kompilowanych do natywnych instrukcji wektorowych na obs\u0142ugiwanych architekturach CPU, oferuj\u0105c wydajno\u015b\u0107 przewy\u017cszaj\u0105c\u0105 r\u00f3wnowa\u017cne obliczenia skalarne.<\/p>\n","innerContent":["\n<p>JEP 469 rozszerza API, kt\u00f3re umo\u017cliwia wyra\u017canie oblicze\u0144 wektorowych, kompilowanych do natywnych instrukcji wektorowych na obs\u0142ugiwanych architekturach CPU, oferuj\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>What issue do they address?:<\/strong> Koncepcja oblicze\u0144 wektorowych, kt\u00f3ra umo\u017cliwia wykonywanie operacji na wielu danych jednocze\u015bnie, by\u0142a trudna do wyra\u017cenia w Javie. W zwi\u0105zku z tym \u015brodowisko polega\u0142o ona na algorytmie auto-wektoryzacji HotSpot, co z kolei ogranicza\u0142o jej praktyczn\u0105 u\u017cyteczno\u015b\u0107 i wydajno\u015b\u0107.<\/p>\n","innerContent":["\n<p><strong>What issue do they address?:<\/strong> Koncepcja oblicze\u0144 wektorowych, kt\u00f3ra umo\u017cliwia wykonywanie operacji na wielu danych jednocze\u015bnie, by\u0142a trudna do wyra\u017cenia w Javie. W zwi\u0105zku z tym \u015brodowisko polega\u0142o ona na algorytmie auto-wektoryzacji HotSpot, co z kolei ogranicza\u0142o jej praktyczn\u0105 u\u017cyteczno\u015b\u0107 i wydajno\u015b\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Solution:<\/strong> Vector API w j\u0119zyku Java umo\u017cliwia tworzenie skomplikowanych algorytm\u00f3w wektorowych z lepsz\u0105 przewidywalno\u015bci\u0105 i niezawodno\u015bci\u0105. Wykorzystuje istniej\u0105cy auto-wektoryzator HotSpot, oferuj\u0105c u\u017cytkownikowi bardziej przewidywalny model.<\/p>\n","innerContent":["\n<p><strong>Solution:<\/strong> Vector API w j\u0119zyku Java umo\u017cliwia tworzenie skomplikowanych algorytm\u00f3w wektorowych z lepsz\u0105 przewidywalno\u015bci\u0105 i niezawodno\u015bci\u0105. Wykorzystuje istniej\u0105cy auto-wektoryzator HotSpot, oferuj\u0105c u\u017cytkownikowi bardziej przewidywalny model.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Changes since the last incubator:<\/strong> API zosta\u0142o ponownie wprowadzone do inkubacji w JDK 22, z drobnymi ulepszeniami z JDK 21, takimi jak poprawki b\u0142\u0119d\u00f3w i zwi\u0119kszenie wydajno\u015bci. Oczekuje si\u0119, \u017ce przed wprowadzeniem wersji Preview zostanie zako\u0144czony Projekt Valhalla.<\/p>\n","innerContent":["\n<p><strong>Changes since the last incubator:<\/strong> API zosta\u0142o ponownie wprowadzone do inkubacji w JDK 22, z drobnymi ulepszeniami z JDK 21, takimi jak poprawki b\u0142\u0119d\u00f3w i zwi\u0119kszenie wydajno\u015bci. Oczekuje si\u0119, \u017ce przed wprowadzeniem wersji Preview zostanie zako\u0144czony Projekt Valhalla.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/18200","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=18200"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/18200\/revisions"}],"predecessor-version":[{"id":18228,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/18200\/revisions\/18228"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/18226"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=18200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=18200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=18200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}