{"id":15652,"date":"2023-04-06T14:38:36","date_gmt":"2023-04-06T12:38:36","guid":{"rendered":"https:\/\/vived.io\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/"},"modified":"2023-04-06T15:37:10","modified_gmt":"2023-04-06T13:37:10","slug":"dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/","title":{"rendered":"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 &#8211; JVM Weekly vol. 130"},"content":{"rendered":"\n<h2 id=\"1-jep-401-implicitly-value-object-creation-preview\" data-num=1>1. JEP 401: Implicitly Value Object Creation (Preview)<\/h2>\n\n\n\n<p>Projekt Valhalla kontratakuje! I materializuje kolejny zestaw zmian pod postaci\u0105 <a href=\"https:\/\/openjdk.org\/jeps\/402\">JEP 401: Implicitly Value Object Creation (Preview)<\/a> Jest to o tyle ciekawe, \u017ce ca\u0142y proposal jeszcze niedawno nazywa\u0142o si\u0119 <strong>Null-Restricted Value Object Storage<\/strong>, a jeszcze wcze\u015bniej <strong>Primitive Classes<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"709\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-15609\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png 750w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8-300x284.png 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><figcaption class=\"wp-element-caption\">Z Valhall\u0105 nie da si\u0119 nudzi\u0107.<\/figcaption><\/figure><\/div>\n\n\n<p>Przechodz\u0105c jednak do meritum, ten JEP bierze sobie za cel popraw\u0119 wydajno\u015bci przechowywania &#8222;klas warto\u015bci&#8221; (value classes). Value classes s\u0105 klasami, kt\u00f3re zosta\u0142y zaprojektowane tak, aby mie\u0107 podobny profil wydajno\u015bci do typ\u00f3w prymitywnych, ale z dodatkowymi korzy\u015bciami (mo\u017cliwo\u015b\u0107 tworzenia abstrakcji, enkapsulacja), kt\u00f3re zapewniaj\u0105 klasy.<\/p>\n\n\n\n<p>Klasy warto\u015bci zosta\u0142y zaprojektowane tak, aby by\u0142y szybsze i zu\u017cywa\u0142y mniej pami\u0119ci ni\u017c zwyk\u0142e klasy. S\u0105 one jednak ograniczone w u\u017cyciu, poniewa\u017c np. nie pozwalaj\u0105 na warto\u015bci null. Aby rozwi\u0105za\u0107 te ograniczenia, JEP wprowadza dwie nowe cechy: opcjonalne konstruktory i null-restricted types, o kt\u00f3rych wprowadzeniu dyskutowano swego czasu na listach mailingowych. Konstruktory opcjonalne pozwalaj\u0105 programistom tworzy\u0107 instancje value classes w spos\u00f3b odmienny ni\u017c ma to miejsc w wypadku innych klas &#8211; mo\u017cliwe jest np. pomini\u0119cie konstruktora. Typy z ograniczeniem nullowalno\u015bci (za diab\u0142a nie wiem jak to \u0142adnie przet\u0142umaczy\u0107) pozwalaj\u0105 programistom zadeklarowa\u0107, \u017ce zmienna lub warto\u015b\u0107 zwracana przez metod\u0119 nie mo\u017ce mie\u0107 warto\u015bci null i automatycznie inicjuj\u0105 zmienne domy\u015bln\u0105 instancj\u0105 klasy, gdy s\u0105 one tworzone.<\/p>\n\n\n\n<p>\u017beby osi\u0105gn\u0105\u0107 to ostatnie, posil\u0119 si\u0119 fragmentem z oryginalnego JEP-a. Je\u015bli jeste\u015bcie ciekawi jak b\u0119dzie mia\u0142 wygl\u0105da\u0107 dodatkowy syntax obs\u0142ugi nulli:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Foo&lt;T&gt; {\n    T* get(); \/\/ Foo&lt;char&gt; returns char\n    T! getNonNull(); \/\/ Foo&lt;char&gt; returns char\n    T? getOrNull(); \/\/ Foo&lt;char&gt; returns Character?\n    T getOrAlternate(Supplier&lt;T&gt; alt); Foo&lt;char&gt; returns Character\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-15613\" width=\"491\" height=\"370\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png 982w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9-300x226.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9-768x579.png 768w\" sizes=\"auto, (max-width: 491px) 100vw, 491px\" \/><figcaption class=\"wp-element-caption\">Wyczuwam Kotlina, mimo \u017ce tw\u00f3rcy JDK do\u015b\u0107 cz\u0119sto si\u0119 od tej inspiracji od\u017cegnuj\u0105<\/figcaption><\/figure><\/div>\n\n\n<p>Oczywi\u015bcie, m\u00f3wimy tutaj tylko i wy\u0142\u0105cznie o Drafcie, wi\u0119c wszystko si\u0119 mo\u017ce zmieni\u0107. \u017beby podkre\u015bli\u0107, z jak wczesn\u0105 wersj\u0105 mamy do czynienia &#8211; JEP 401 linkuje do <a href=\"https:\/\/openjdk.org\/jeps\/8303099\">Nullness Marker JEP<\/a> kt\u00f3ry&#8230; jeszcze nie istnieje. W chwili pisania tekstu, link zwraca odpowied\u017a 404.<\/p>\n\n\n\n<h2 id=\"2-jep-443-unnamed-patterns-and-variables\" data-num=2>2. JEP 443: Unnamed Patterns and Variables<\/h2>\n\n\n\n<p>Po do\u015b\u0107 skomplikowanym, bardzo wczesnym JEP-ie dotycz\u0105cym Valhalli przygl\u0105dniemy si\u0119 nieco prostszemu <a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443: Unnamed Patterns and Variables (Preview)<\/a>, kt\u00f3ry osi\u0105gn\u0105\u0142 niedawno status kandydata.<\/p>\n\n\n\n<p>Zacznijmy od nienazwanych wzorc\u00f3w. Rozwa\u017cmy nast\u0119puj\u0105ce klasy rekord\u00f3w:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>record Point(int x, int y) {}\nrecord ColoredPoint(Point point, String color) {}\n<\/code><\/pre>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy wyodr\u0119bni\u0107 wsp\u00f3\u0142rz\u0119dn\u0105 x instancji ColoredPoint, ale nie zale\u017cy nam na jej kolorze. Mo\u017cemy to zrobi\u0107 za pomoc\u0105 nienazwanego wzorca:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ColoredPoint coloredPoint = new ColoredPoint(new Point(3, 4), &quot;red&quot;);\n\nif (coloredPoint instanceof ColoredPoint(Point(int x, _), _)) {\n    System.out.println(&quot;x-coordinate is &quot; + x);\n}<\/code><\/pre>\n\n\n\n<p>W tym przyk\u0142adzie &#8222;nienazwany wzorzec&#8221; jest reprezentowany przez znak podkre\u015blenia <code>_<\/code> w miejscu parametru <code>color<\/code> we wzorcu. Dzi\u0119ki temu mo\u017cemy wyodr\u0119bni\u0107 wsp\u00f3\u0142rz\u0119dn\u0105 <code>x<\/code> sk\u0142adnika <code>Point<\/code>\u200c bez konieczno\u015bci okre\u015blania nazwy lub typu sk\u0142adnika <code>color<\/code>.<\/p>\n\n\n\n<p>Wiemy ju\u017c czym s\u0105 &#8222;Nienazwane wzorce&#8221;, przejd\u017amy teraz do czego odnosz\u0105 si\u0119 &#8222;Nienazwane Zmienne&#8221;.<\/p>\n\n\n\n<p>Rozwa\u017cmy nast\u0119puj\u0105cy kod, kt\u00f3ry wyci\u0105ga dane z kolejki i tworzy instancje <code>Point2D<\/code> z listy wsp\u00f3\u0142rz\u0119dnych w przestrzeni 3D.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    int x = queue.remove();\n    int y = queue.remove();\n    int z = queue.remove();\n    points.add(new Point2D(x, y));\n}\n<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"698\" height=\"742\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-15635\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png 698w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12-282x300.png 282w\" sizes=\"auto, (max-width: 698px) 100vw, 698px\" \/><figcaption class=\"wp-element-caption\">Je\u017celi powy\u017csze wydaje si\u0119 Wam by\u0107 dziwne, w\u0142a\u015bnie udowodnili\u015bcie mi, \u017ce nie bawicie si\u0119 w <a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a><\/figcaption><\/figure><\/div>\n\n\n<p>Jak widzicie, w ka\u017cdym przej\u015bciu p\u0119tli &#8222;dropujemy&#8221; warto\u015b\u0107 z. W takim przypadku mo\u017cemy zadeklarowa\u0107 t\u0105 zmienne jako nienazwan\u0105 u\u017cywaj\u0105c symbolu <code>_<\/code> (tym razem Scala si\u0119 k\u0142ania):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    var x = queue.remove();\n    int y = queue.remove();\n    var _ = queue.remove();\n    points.add(new Point2D(x, y));\n}<\/code><\/pre>\n\n\n\n<p>Dzi\u0119ki temu mo\u017cemy skupi\u0107 si\u0119 na zmiennej <code>x<\/code> i <code>y<\/code>, kt\u00f3re jako jedyne s\u0105 wa\u017cne w tym kontek\u015bcie. Symbol <code>_<\/code> jest u\u017cywana jako placeholder dla nieu\u017cywanej zmiennej i nie mo\u017ce by\u0107 u\u017cyta nigdzie indziej w kodzie, poniewa\u017c nie ma nazwy.<\/p>\n\n\n\n<p>Przyznam szczerze, mnie powy\u017cszy przyk\u0142ad jako\u015b nie przekona\u0142, jednak autorzy twierdz\u0105, \u017ce nienazwane zmienne mog\u0105 by\u0107 u\u017cyteczne w sytuacjach, gdy nazwy zmiennych s\u0105 nieistotne lub gdy zmienne nie s\u0105 u\u017cywane i ma poprawi\u0107 czytelno\u015b\u0107 i utrzymanie kodu. Ponadto, nienazwane zmienne mog\u0105 pom\u00f3c w redukcji fa\u0142szywych alarm\u00f3w generowanych przez narz\u0119dzia analizy statycznej, kt\u00f3re zwracaj\u0105 uwag\u0119 na nieu\u017cywane zmienne. Ja osobi\u015bcie najwi\u0119ksz\u0105 szans\u0119 widz\u0119 w przypadku parametr\u00f3w wyj\u0105tk\u00f3w, aczkolwiek poni\u017csze te\u017c si\u0119 jednak wydaje by\u0107 pewnym code smellem:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>try {\n    ...\n} catch (NumberFormatException _) { \n    System.out.println(&quot;Bad number&quot;);\n}<\/code><\/pre>\n\n\n\n<h2 id=\"3-release-radar-dropwizard-3-0-i-4-0\" data-num=3>3. Release Radar: Dropwizard 3.0 i 4.0<\/h2>\n\n\n\n<p>Pami\u0119tam czasy, gdy u\u017cywa\u0142em Dropwizarda, kiedy ten szumnie obiecuj\u0105cy framework znajdowa\u0142 si\u0119 na samym szczycie popularno\u015bci. Wydawa\u0142o mi si\u0119 wtedy, \u017ce to w\u0142a\u015bnie on zapowiada przysz\u0142o\u015b\u0107 tworzenia aplikacji internetowych i zostanie na d\u0142u\u017cej w \u015bwiadomo\u015bci programist\u00f3w. Niestety, \u017cycie i rynek potoczy\u0142y si\u0119 inaczej. Mimo pierwotnego entuzjazmu, DropWizard zacz\u0105\u0142 traci\u0107 na znaczeniu, a inne narz\u0119dzia i technologie przy\u0107mi\u0142y jego \u015bwietno\u015b\u0107. Dzi\u015b, kiedy obserwujemy r\u00f3wnoczesn\u0105 premier\u0119 <a href=\"https:\/\/github.com\/dropwizard\/dropwizard\/releases\/tag\/v3.0.0\">wersji 3.0<\/a> i <a href=\"https:\/\/github.com\/dropwizard\/dropwizard\/releases\/tag\/v4.0.0\">4.0<\/a>, to wydarzenie przechodzi bez echa w \u015bwiecie technologii, co tylko \u015bwiadczy o tym, jak bardzo zmieni\u0142a si\u0119 percepcja tego niegdy\u015b obiecuj\u0105cego projektu.<\/p>\n\n\n\n<p>Co tak naprawd\u0119 przyci\u0105ga uwag\u0119, to wsp\u00f3lna premiera wersji 3 i 4, co mo\u017ce by\u0107 nieco myl\u0105ce. Pow\u00f3d dw\u00f3ch wersji jest prosty: Dropwizard 3.0.0 opiera si\u0119 na Java EE i przestrzeni nazw <code>javax.<\/code>, dzi\u0119ki czemu migracja z Dropwizard 2.x do wersji 3.0.0 powinna by\u0107 minimalna dla wielu projekt\u00f3w. Natomiast Dropwizard 4.0.0 opiera si\u0119 na zale\u017cno\u015bciach Jakarta EE oraz przestrzeni nazw <code>jakarta.<\/code>, co mo\u017ce wi\u0105za\u0107 si\u0119 z wi\u0119kszym nak\u0142adem pracy przy migracji z Dropwizard 2.x do wersji 4.0.0 ze wzgl\u0119du na wi\u0119cej zmian w pakietach i wi\u0119ksz\u0105 liczb\u0119 istotnych zmian w zale\u017cno\u015bciach.<\/p>\n\n\n\n<p>Obie wersje \u0142\u0105czy te\u017c troch\u0119 wsp\u00f3lnych zmian &#8211; podniesienie wymaganej wersji Javy do 11, wprowadzenie struktury pakiet\u00f3w opartej o JPMS (mam wra\u017cenie, \u017ce to jedno z pierwszych narz\u0119dzi bior\u0105cych ten standard na powa\u017cnie), aktualizacj\u0119 Jetty do wersji 10.0.x (kt\u00f3ra te\u017c wymaga minimum Javy 11), aktualizacj\u0119 Apache HttpClient do wersji 5.x oraz usuni\u0119cie wsparcia dla JUnit 4.x (przeniesione do <code>dropwizard-testing-junit4<\/code>). Dodatkowo, Dropwizard 4.0 dostanie wsparcie dla Hibernate 6.0, wymagaj\u0105cego przej\u015bcia na <code>jakarta.<\/code><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png\" alt=\"\" class=\"wp-image-15617\" width=\"512\" height=\"330\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-300x193.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-768x495.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10.png 1332w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption class=\"wp-element-caption\">Ja wiem, \u017ce to nie jest a\u017c tak skomplikowane, ale dale przyda\u0142by si\u0119 jaki\u015b diagram<\/figcaption><\/figure><\/div>\n\n\n<p>Reakcja spo\u0142eczno\u015bci na Dropwizard 3.0 i 4.0 jest do\u015b\u0107 mieszana. Niekt\u00f3rzy programi\u015bci przyjmuj\u0105 nowe wydania z mo\u017ce nie ekscytacj\u0105, ale przynajmniej pewnym sentymentem (sam zaliczam si\u0119 do tego grona). Zagorzali fani Dropwizarda m\u00f3wi\u0105 o jego &#8222;praktycznie pozbawionej b\u0142\u0119d\u00f3w&#8221; naturze i wykorzystaniu sprawdzonych zale\u017cno\u015bci. Jest jak stary, przytulny sweter, kt\u00f3rego nie czujesz potrzeby wyrzuca\u0107 wyrzuci\u0107. Doceniaj\u0105 r\u00f3wnie\u017c to, \u017ce Dropwizard nie jest maniakiem kontroli, w przeciwie\u0144stwie do niekt\u00f3rych innych framework\u00f3w (ekh ekh, Spring Boot), pozwalaj\u0105c programistom miesza\u0107 i dopasowywa\u0107 komponenty do woli.<\/p>\n\n\n\n<p>S\u0105 jednak i tacy, kt\u00f3rzy uwa\u017caj\u0105, \u017ce Dropwizard zaczyna pokazywa\u0107 sw\u00f3j wiek, podobnie jak telefon z klapk\u0105, kt\u00f3ry znalaz\u0142e\u015b w swojej szufladzie. Twierdz\u0105, \u017ce na scen\u0119 wkroczy\u0142y bardziej eleganckie i b\u0142yszcz\u0105ce frameworki, takie jak Micronaut, Quarkus i Helidon, oferuj\u0105ce wymy\u015blne funkcje, takie jak programowanie reaktywne, turbodo\u0142adowan\u0105 wydajno\u015b\u0107 i bycie Cloud-Native.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"280\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/yeah-i-member-memberberries.gif\" alt=\"\" class=\"wp-image-15622\"\/><figcaption class=\"wp-element-caption\">A kto\u015b z Was jeszcze pami\u0119ta Dropwizarda?<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"4-release-radar-hibernate-6-20\" data-num=4>4. Release Radar: Hibernate 6.20<\/h2>\n\n\n\n<p>A na koniec jeszcze nowy Hibernate ORM 6.2.0 Final.<\/p>\n\n\n\n<p>Wydanie wprowadza strukturyzowane typy SQL, takie jak Struct, XML i JSON, co pozwala u\u017cytkownikom pracowa\u0107 z bardziej z\u0142o\u017conymi strukturami danych. Powi\u0105zanym z tym dodatkiem jest wsparcie dla Rekord\u00f3w, kt\u00f3re umo\u017cliwia Hibernate deserializacje wspomnianych typ\u00f3w strukturalnych w obie strony.<\/p>\n\n\n\n<p>Wydanie to r\u00f3wnie\u017c ujednolica adnotacje s\u0142u\u017c\u0105ce do generowania warto\u015bci. Co wi\u0119cej, Hibernate oferuje teraz pe\u0142ne wsparcie dla partycji bazy danych za pomoc\u0105 adnotacji <code>@PartitionKey<\/code>, co upraszcza proces mapowania kolumn partycji.<\/p>\n\n\n\n<p>Ostatni\u0105 godn\u0105 uwagi funkcj\u0105 Hibernate ORM 6.2.0 jest implementacja SQL MERGE. Mechanizm ten dzia\u0142a w taki spos\u00f3b nieco zbli\u017cony do UPSERT. Jest jednak sporo pot\u0119\u017cniejszy, bowiem zamiast tylko aktualizowa\u0107, umo\u017cliwia r\u00f3wnie\u017c usuwanie rekord\u00f3w, a tak\u017ce umo\u017cliwia przekazanie dodatkowych warunk\u00f3w do zapytania, typu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;\nON CONFLICT (country) DO NOTHING;<\/code><\/pre>\n\n\n\n<p>Co prawda Hibernate u\u017cywa go w spos\u00f3b niewidoczny dla u\u017cytkownika ko\u0144cowego, ale mnie ta nowo\u015b\u0107 pozwoli\u0142a nieco poszerzy\u0107 swoj\u0105 wiedz\u0119 o SQL, wi\u0119c si\u0119 dziele.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-15625\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png 675w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11-300x222.png 300w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><figcaption class=\"wp-element-caption\">Mam wra\u017cenie \u017ce z SQL-em jest jak z Excelem &#8211; wszyscy krytykuj\u0105, u\u017cywaj\u0105c 10% jego mo\u017cliwo\u015bci.<\/figcaption><\/figure><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>A, i by\u0142 te\u017c Kotlin 1.8.20, ale jako \u017ce w przysz\u0142ym tygodniu b\u0119dzie KotlinConf, to tym tematem zajmiemy si\u0119 w nast\u0119pnej edycji, pewnie mocno kotlinowej.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nie by\u0142o nas tydzie\u0144 temu (mia\u0142em wyst\u0105pienie na JUGu i czasowo ju\u017c nie wyrobi\u0142em), ale to nie znaczy, \u017ce te\u017c jako\u015b bardzo wiele si\u0119 wydarzy\u0142o w ostatnie dwa tygodnie. Mam wra\u017cenie, \u017ce po premierze JDK 20 weszli\u015bmy w swoisty sezon og\u00f3rkowy, co jednak nie znaczy, \u017ce nie dzia\u0142o si\u0119 nic ciekawego. Mimo wszystko, mam dzisiaj dla Was dwa JEPy oraz kilka nowych wyda\u0144, niekt\u00f3rych ca\u0142kiem interesuj\u0105cych.<\/p>\n","protected":false},"author":10,"featured_media":15632,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-15652","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl"],"acf":{"estimated_reading_time":"7","feature_image_blog":{"ID":15649,"id":15649,"title":"ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35","filename":"ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","filesize":1960240,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","link":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/arturskowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-2\/","alt":"","author":"10","description":"","caption":"","name":"arturskowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-2","status":"inherit","uploaded_to":15605,"date":"2023-04-06 13:15:38","modified":"2023-04-06 13:15:38","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1536,"height":1024,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-150x150.png","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-300x200.png","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-768x512.png","medium_large-width":768,"medium_large-height":512,"large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-1024x683.png","large-width":1024,"large-height":683,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","1536x1536-width":1536,"1536x1536-height":1024,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","2048x2048-width":1536,"2048x2048-height":1024,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":400}},"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 - JVM Weekly vol. 130 - 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\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 - JVM Weekly vol. 130 - Vived\" \/>\n<meta property=\"og:description\" content=\"Nie by\u0142o nas tydzie\u0144 temu (mia\u0142em wyst\u0105pienie na JUGu i czasowo ju\u017c nie wyrobi\u0142em), ale to nie znaczy, \u017ce te\u017c jako\u015b bardzo wiele si\u0119 wydarzy\u0142o w ostatnie dwa tygodnie. Mam wra\u017cenie, \u017ce po premierze JDK 20 weszli\u015bmy w swoisty sezon og\u00f3rkowy, co jednak nie znaczy, \u017ce nie dzia\u0142o si\u0119 nic ciekawego. Mimo wszystko, mam dzisiaj dla Was dwa JEPy oraz kilka nowych wyda\u0144, niekt\u00f3rych ca\u0142kiem interesuj\u0105cych.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-06T12:38:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-06T13:37:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 &#8211; JVM Weekly vol. 130\",\"datePublished\":\"2023-04-06T12:38:36+00:00\",\"dateModified\":\"2023-04-06T13:37:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\"},\"wordCount\":1376,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\",\"url\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\",\"name\":\"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 - JVM Weekly vol. 130 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png\",\"datePublished\":\"2023-04-06T12:38:36+00:00\",\"dateModified\":\"2023-04-06T13:37:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 &#8211; JVM Weekly vol. 130\"}]},{\"@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":"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 - JVM Weekly vol. 130 - 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\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/","og_locale":"pl_PL","og_type":"article","og_title":"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 - JVM Weekly vol. 130 - Vived","og_description":"Nie by\u0142o nas tydzie\u0144 temu (mia\u0142em wyst\u0105pienie na JUGu i czasowo ju\u017c nie wyrobi\u0142em), ale to nie znaczy, \u017ce te\u017c jako\u015b bardzo wiele si\u0119 wydarzy\u0142o w ostatnie dwa tygodnie. Mam wra\u017cenie, \u017ce po premierze JDK 20 weszli\u015bmy w swoisty sezon og\u00f3rkowy, co jednak nie znaczy, \u017ce nie dzia\u0142o si\u0119 nic ciekawego. Mimo wszystko, mam dzisiaj dla Was dwa JEPy oraz kilka nowych wyda\u0144, niekt\u00f3rych ca\u0142kiem interesuj\u0105cych.","og_url":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/","og_site_name":"Vived","article_published_time":"2023-04-06T12:38:36+00:00","article_modified_time":"2023-04-06T13:37:10+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.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\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 &#8211; JVM Weekly vol. 130","datePublished":"2023-04-06T12:38:36+00:00","dateModified":"2023-04-06T13:37:10+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/"},"wordCount":1376,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/","url":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/","name":"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 - JVM Weekly vol. 130 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png","datePublished":"2023-04-06T12:38:36+00:00","dateModified":"2023-04-06T13:37:10+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Dropwizard wraca z r\u00f3wnoleg\u0142ym wydaniem 3.0 i 4.0 &#8211; JVM Weekly vol. 130"}]},{"@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>1. JEP 401: Implicitly Value Object Creation (Preview)<\/h2>\n","innerContent":["\n<h2>1. JEP 401: Implicitly Value Object Creation (Preview)<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Projekt Valhalla kontratakuje! I materializuje kolejny zestaw zmian pod postaci\u0105 <a href=\"https:\/\/openjdk.org\/jeps\/402\">JEP 401: Implicitly Value Object Creation (Preview)<\/a> Jest to o tyle ciekawe, \u017ce ca\u0142y proposal jeszcze niedawno nazywa\u0142o si\u0119 <strong>Null-Restricted Value Object Storage<\/strong>, a jeszcze wcze\u015bniej <strong>Primitive Classes<\/strong>.<\/p>\n","innerContent":["\n<p>Projekt Valhalla kontratakuje! I materializuje kolejny zestaw zmian pod postaci\u0105 <a href=\"https:\/\/openjdk.org\/jeps\/402\">JEP 401: Implicitly Value Object Creation (Preview)<\/a> Jest to o tyle ciekawe, \u017ce ca\u0142y proposal jeszcze niedawno nazywa\u0142o si\u0119 <strong>Null-Restricted Value Object Storage<\/strong>, a jeszcze wcze\u015bniej <strong>Primitive Classes<\/strong>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15609,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-15609\"\/><figcaption class=\"wp-element-caption\">Z Valhall\u0105 nie da si\u0119 nudzi\u0107.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-15609\"\/><figcaption class=\"wp-element-caption\">Z Valhall\u0105 nie da si\u0119 nudzi\u0107.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przechodz\u0105c jednak do meritum, ten JEP bierze sobie za cel popraw\u0119 wydajno\u015bci przechowywania \"klas warto\u015bci\" (value classes). Value classes s\u0105 klasami, kt\u00f3re zosta\u0142y zaprojektowane tak, aby mie\u0107 podobny profil wydajno\u015bci do typ\u00f3w prymitywnych, ale z dodatkowymi korzy\u015bciami (mo\u017cliwo\u015b\u0107 tworzenia abstrakcji, enkapsulacja), kt\u00f3re zapewniaj\u0105 klasy.<\/p>\n","innerContent":["\n<p>Przechodz\u0105c jednak do meritum, ten JEP bierze sobie za cel popraw\u0119 wydajno\u015bci przechowywania \"klas warto\u015bci\" (value classes). Value classes s\u0105 klasami, kt\u00f3re zosta\u0142y zaprojektowane tak, aby mie\u0107 podobny profil wydajno\u015bci do typ\u00f3w prymitywnych, ale z dodatkowymi korzy\u015bciami (mo\u017cliwo\u015b\u0107 tworzenia abstrakcji, enkapsulacja), kt\u00f3re zapewniaj\u0105 klasy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Klasy warto\u015bci zosta\u0142y zaprojektowane tak, aby by\u0142y szybsze i zu\u017cywa\u0142y mniej pami\u0119ci ni\u017c zwyk\u0142e klasy. S\u0105 one jednak ograniczone w u\u017cyciu, poniewa\u017c np. nie pozwalaj\u0105 na warto\u015bci null. Aby rozwi\u0105za\u0107 te ograniczenia, JEP wprowadza dwie nowe cechy: opcjonalne konstruktory i null-restricted types, o kt\u00f3rych wprowadzeniu dyskutowano swego czasu na listach mailingowych. Konstruktory opcjonalne pozwalaj\u0105 programistom tworzy\u0107 instancje value classes w spos\u00f3b odmienny ni\u017c ma to miejsc w wypadku innych klas - mo\u017cliwe jest np. pomini\u0119cie konstruktora. Typy z ograniczeniem nullowalno\u015bci (za diab\u0142a nie wiem jak to \u0142adnie przet\u0142umaczy\u0107) pozwalaj\u0105 programistom zadeklarowa\u0107, \u017ce zmienna lub warto\u015b\u0107 zwracana przez metod\u0119 nie mo\u017ce mie\u0107 warto\u015bci null i automatycznie inicjuj\u0105 zmienne domy\u015bln\u0105 instancj\u0105 klasy, gdy s\u0105 one tworzone.<\/p>\n","innerContent":["\n<p>Klasy warto\u015bci zosta\u0142y zaprojektowane tak, aby by\u0142y szybsze i zu\u017cywa\u0142y mniej pami\u0119ci ni\u017c zwyk\u0142e klasy. S\u0105 one jednak ograniczone w u\u017cyciu, poniewa\u017c np. nie pozwalaj\u0105 na warto\u015bci null. Aby rozwi\u0105za\u0107 te ograniczenia, JEP wprowadza dwie nowe cechy: opcjonalne konstruktory i null-restricted types, o kt\u00f3rych wprowadzeniu dyskutowano swego czasu na listach mailingowych. Konstruktory opcjonalne pozwalaj\u0105 programistom tworzy\u0107 instancje value classes w spos\u00f3b odmienny ni\u017c ma to miejsc w wypadku innych klas - mo\u017cliwe jest np. pomini\u0119cie konstruktora. Typy z ograniczeniem nullowalno\u015bci (za diab\u0142a nie wiem jak to \u0142adnie przet\u0142umaczy\u0107) pozwalaj\u0105 programistom zadeklarowa\u0107, \u017ce zmienna lub warto\u015b\u0107 zwracana przez metod\u0119 nie mo\u017ce mie\u0107 warto\u015bci null i automatycznie inicjuj\u0105 zmienne domy\u015bln\u0105 instancj\u0105 klasy, gdy s\u0105 one tworzone.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>\u017beby osi\u0105gn\u0105\u0107 to ostatnie, posil\u0119 si\u0119 fragmentem z oryginalnego JEP-a. Je\u015bli jeste\u015bcie ciekawi jak b\u0119dzie mia\u0142 wygl\u0105da\u0107 dodatkowy syntax obs\u0142ugi nulli:<\/p>\n","innerContent":["\n<p>\u017beby osi\u0105gn\u0105\u0107 to ostatnie, posil\u0119 si\u0119 fragmentem z oryginalnego JEP-a. Je\u015bli jeste\u015bcie ciekawi jak b\u0119dzie mia\u0142 wygl\u0105da\u0107 dodatkowy syntax obs\u0142ugi nulli:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>interface Foo&lt;T&gt; {\n    T* get(); \/\/ Foo&lt;char&gt; returns char\n    T! getNonNull(); \/\/ Foo&lt;char&gt; returns char\n    T? getOrNull(); \/\/ Foo&lt;char&gt; returns Character?\n    T getOrAlternate(Supplier&lt;T&gt; alt); Foo&lt;char&gt; returns Character\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>interface Foo&lt;T&gt; {\n    T* get(); \/\/ Foo&lt;char&gt; returns char\n    T! getNonNull(); \/\/ Foo&lt;char&gt; returns char\n    T? getOrNull(); \/\/ Foo&lt;char&gt; returns Character?\n    T getOrAlternate(Supplier&lt;T&gt; alt); Foo&lt;char&gt; returns Character\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15613,"width":491,"height":370,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-15613\" width=\"491\" height=\"370\"\/><figcaption class=\"wp-element-caption\">Wyczuwam Kotlina, mimo \u017ce tw\u00f3rcy JDK do\u015b\u0107 cz\u0119sto si\u0119 od tej inspiracji od\u017cegnuj\u0105<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-15613\" width=\"491\" height=\"370\"\/><figcaption class=\"wp-element-caption\">Wyczuwam Kotlina, mimo \u017ce tw\u00f3rcy JDK do\u015b\u0107 cz\u0119sto si\u0119 od tej inspiracji od\u017cegnuj\u0105<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, m\u00f3wimy tutaj tylko i wy\u0142\u0105cznie o Drafcie, wi\u0119c wszystko si\u0119 mo\u017ce zmieni\u0107. \u017beby podkre\u015bli\u0107, z jak wczesn\u0105 wersj\u0105 mamy do czynienia - JEP 401 linkuje do <a href=\"https:\/\/openjdk.org\/jeps\/8303099\">Nullness Marker JEP<\/a> kt\u00f3ry... jeszcze nie istnieje. W chwili pisania tekstu, link zwraca odpowied\u017a 404.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, m\u00f3wimy tutaj tylko i wy\u0142\u0105cznie o Drafcie, wi\u0119c wszystko si\u0119 mo\u017ce zmieni\u0107. \u017beby podkre\u015bli\u0107, z jak wczesn\u0105 wersj\u0105 mamy do czynienia - JEP 401 linkuje do <a href=\"https:\/\/openjdk.org\/jeps\/8303099\">Nullness Marker JEP<\/a> kt\u00f3ry... jeszcze nie istnieje. W chwili pisania tekstu, link zwraca odpowied\u017a 404.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. JEP 443: Unnamed Patterns and Variables<\/h2>\n","innerContent":["\n<h2>2. JEP 443: Unnamed Patterns and Variables<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Po do\u015b\u0107 skomplikowanym, bardzo wczesnym JEP-ie dotycz\u0105cym Valhalli przygl\u0105dniemy si\u0119 nieco prostszemu <a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443: Unnamed Patterns and Variables (Preview)<\/a>, kt\u00f3ry osi\u0105gn\u0105\u0142 niedawno status kandydata.<\/p>\n","innerContent":["\n<p>Po do\u015b\u0107 skomplikowanym, bardzo wczesnym JEP-ie dotycz\u0105cym Valhalli przygl\u0105dniemy si\u0119 nieco prostszemu <a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443: Unnamed Patterns and Variables (Preview)<\/a>, kt\u00f3ry osi\u0105gn\u0105\u0142 niedawno status kandydata.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zacznijmy od nienazwanych wzorc\u00f3w. Rozwa\u017cmy nast\u0119puj\u0105ce klasy rekord\u00f3w:<\/p>\n","innerContent":["\n<p>Zacznijmy od nienazwanych wzorc\u00f3w. Rozwa\u017cmy nast\u0119puj\u0105ce klasy rekord\u00f3w:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>record Point(int x, int y) {}\nrecord ColoredPoint(Point point, String color) {}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>record Point(int x, int y) {}\nrecord ColoredPoint(Point point, String color) {}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy wyodr\u0119bni\u0107 wsp\u00f3\u0142rz\u0119dn\u0105 x instancji ColoredPoint, ale nie zale\u017cy nam na jej kolorze. Mo\u017cemy to zrobi\u0107 za pomoc\u0105 nienazwanego wzorca:<\/p>\n","innerContent":["\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy wyodr\u0119bni\u0107 wsp\u00f3\u0142rz\u0119dn\u0105 x instancji ColoredPoint, ale nie zale\u017cy nam na jej kolorze. Mo\u017cemy to zrobi\u0107 za pomoc\u0105 nienazwanego wzorca:<\/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>ColoredPoint coloredPoint = new ColoredPoint(new Point(3, 4), \"red\");\n\nif (coloredPoint instanceof ColoredPoint(Point(int x, _), _)) {\n    System.out.println(\"x-coordinate is \" + x);\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ColoredPoint coloredPoint = new ColoredPoint(new Point(3, 4), \"red\");\n\nif (coloredPoint instanceof ColoredPoint(Point(int x, _), _)) {\n    System.out.println(\"x-coordinate is \" + x);\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 \"nienazwany wzorzec\" jest reprezentowany przez znak podkre\u015blenia <code>_<\/code> w miejscu parametru <code>color<\/code> we wzorcu. Dzi\u0119ki temu mo\u017cemy wyodr\u0119bni\u0107 wsp\u00f3\u0142rz\u0119dn\u0105 <code>x<\/code> sk\u0142adnika <code>Point<\/code>\u200c bez konieczno\u015bci okre\u015blania nazwy lub typu sk\u0142adnika <code>color<\/code>.<\/p>\n","innerContent":["\n<p>W tym przyk\u0142adzie \"nienazwany wzorzec\" jest reprezentowany przez znak podkre\u015blenia <code>_<\/code> w miejscu parametru <code>color<\/code> we wzorcu. Dzi\u0119ki temu mo\u017cemy wyodr\u0119bni\u0107 wsp\u00f3\u0142rz\u0119dn\u0105 <code>x<\/code> sk\u0142adnika <code>Point<\/code>\u200c bez konieczno\u015bci okre\u015blania nazwy lub typu sk\u0142adnika <code>color<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wiemy ju\u017c czym s\u0105 \"Nienazwane wzorce\", przejd\u017amy teraz do czego odnosz\u0105 si\u0119 \"Nienazwane Zmienne\".<\/p>\n","innerContent":["\n<p>Wiemy ju\u017c czym s\u0105 \"Nienazwane wzorce\", przejd\u017amy teraz do czego odnosz\u0105 si\u0119 \"Nienazwane Zmienne\".<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Rozwa\u017cmy nast\u0119puj\u0105cy kod, kt\u00f3ry wyci\u0105ga dane z kolejki i tworzy instancje <code>Point2D<\/code> z listy wsp\u00f3\u0142rz\u0119dnych w przestrzeni 3D.<\/p>\n","innerContent":["\n<p>Rozwa\u017cmy nast\u0119puj\u0105cy kod, kt\u00f3ry wyci\u0105ga dane z kolejki i tworzy instancje <code>Point2D<\/code> z listy wsp\u00f3\u0142rz\u0119dnych w przestrzeni 3D.<\/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>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    int x = queue.remove();\n    int y = queue.remove();\n    int z = queue.remove();\n    points.add(new Point2D(x, y));\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    int x = queue.remove();\n    int y = queue.remove();\n    int z = queue.remove();\n    points.add(new Point2D(x, y));\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15635,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-15635\"\/><figcaption class=\"wp-element-caption\">Je\u017celi powy\u017csze wydaje si\u0119 Wam by\u0107 dziwne, w\u0142a\u015bnie udowodnili\u015bcie mi, \u017ce nie bawicie si\u0119 w <a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a><\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-15635\"\/><figcaption class=\"wp-element-caption\">Je\u017celi powy\u017csze wydaje si\u0119 Wam by\u0107 dziwne, w\u0142a\u015bnie udowodnili\u015bcie mi, \u017ce nie bawicie si\u0119 w <a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a><\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak widzicie, w ka\u017cdym przej\u015bciu p\u0119tli \"dropujemy\" warto\u015b\u0107 z. W takim przypadku mo\u017cemy zadeklarowa\u0107 t\u0105 zmienne jako nienazwan\u0105 u\u017cywaj\u0105c symbolu <code>_<\/code> (tym razem Scala si\u0119 k\u0142ania):<\/p>\n","innerContent":["\n<p>Jak widzicie, w ka\u017cdym przej\u015bciu p\u0119tli \"dropujemy\" warto\u015b\u0107 z. W takim przypadku mo\u017cemy zadeklarowa\u0107 t\u0105 zmienne jako nienazwan\u0105 u\u017cywaj\u0105c symbolu <code>_<\/code> (tym razem Scala si\u0119 k\u0142ania):<\/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>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    var x = queue.remove();\n    int y = queue.remove();\n    var _ = queue.remove();\n    points.add(new Point2D(x, y));\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    var x = queue.remove();\n    int y = queue.remove();\n    var _ = queue.remove();\n    points.add(new Point2D(x, y));\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dzi\u0119ki temu mo\u017cemy skupi\u0107 si\u0119 na zmiennej <code>x<\/code> i <code>y<\/code>, kt\u00f3re jako jedyne s\u0105 wa\u017cne w tym kontek\u015bcie. Symbol <code>_<\/code> jest u\u017cywana jako placeholder dla nieu\u017cywanej zmiennej i nie mo\u017ce by\u0107 u\u017cyta nigdzie indziej w kodzie, poniewa\u017c nie ma nazwy.<\/p>\n","innerContent":["\n<p>Dzi\u0119ki temu mo\u017cemy skupi\u0107 si\u0119 na zmiennej <code>x<\/code> i <code>y<\/code>, kt\u00f3re jako jedyne s\u0105 wa\u017cne w tym kontek\u015bcie. Symbol <code>_<\/code> jest u\u017cywana jako placeholder dla nieu\u017cywanej zmiennej i nie mo\u017ce by\u0107 u\u017cyta nigdzie indziej w kodzie, poniewa\u017c nie ma nazwy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przyznam szczerze, mnie powy\u017cszy przyk\u0142ad jako\u015b nie przekona\u0142, jednak autorzy twierdz\u0105, \u017ce nienazwane zmienne mog\u0105 by\u0107 u\u017cyteczne w sytuacjach, gdy nazwy zmiennych s\u0105 nieistotne lub gdy zmienne nie s\u0105 u\u017cywane i ma poprawi\u0107 czytelno\u015b\u0107 i utrzymanie kodu. Ponadto, nienazwane zmienne mog\u0105 pom\u00f3c w redukcji fa\u0142szywych alarm\u00f3w generowanych przez narz\u0119dzia analizy statycznej, kt\u00f3re zwracaj\u0105 uwag\u0119 na nieu\u017cywane zmienne. Ja osobi\u015bcie najwi\u0119ksz\u0105 szans\u0119 widz\u0119 w przypadku parametr\u00f3w wyj\u0105tk\u00f3w, aczkolwiek poni\u017csze te\u017c si\u0119 jednak wydaje by\u0107 pewnym code smellem:<\/p>\n","innerContent":["\n<p>Przyznam szczerze, mnie powy\u017cszy przyk\u0142ad jako\u015b nie przekona\u0142, jednak autorzy twierdz\u0105, \u017ce nienazwane zmienne mog\u0105 by\u0107 u\u017cyteczne w sytuacjach, gdy nazwy zmiennych s\u0105 nieistotne lub gdy zmienne nie s\u0105 u\u017cywane i ma poprawi\u0107 czytelno\u015b\u0107 i utrzymanie kodu. Ponadto, nienazwane zmienne mog\u0105 pom\u00f3c w redukcji fa\u0142szywych alarm\u00f3w generowanych przez narz\u0119dzia analizy statycznej, kt\u00f3re zwracaj\u0105 uwag\u0119 na nieu\u017cywane zmienne. Ja osobi\u015bcie najwi\u0119ksz\u0105 szans\u0119 widz\u0119 w przypadku parametr\u00f3w wyj\u0105tk\u00f3w, aczkolwiek poni\u017csze te\u017c si\u0119 jednak wydaje by\u0107 pewnym code smellem:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>try {\n    ...\n} catch (NumberFormatException _) { \n    System.out.println(\"Bad number\");\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>try {\n    ...\n} catch (NumberFormatException _) { \n    System.out.println(\"Bad number\");\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Release Radar: Dropwizard 3.0 i 4.0<\/h2>\n","innerContent":["\n<h2>3. Release Radar: Dropwizard 3.0 i 4.0<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pami\u0119tam czasy, gdy u\u017cywa\u0142em Dropwizarda, kiedy ten szumnie obiecuj\u0105cy framework znajdowa\u0142 si\u0119 na samym szczycie popularno\u015bci. Wydawa\u0142o mi si\u0119 wtedy, \u017ce to w\u0142a\u015bnie on zapowiada przysz\u0142o\u015b\u0107 tworzenia aplikacji internetowych i zostanie na d\u0142u\u017cej w \u015bwiadomo\u015bci programist\u00f3w. Niestety, \u017cycie i rynek potoczy\u0142y si\u0119 inaczej. Mimo pierwotnego entuzjazmu, DropWizard zacz\u0105\u0142 traci\u0107 na znaczeniu, a inne narz\u0119dzia i technologie przy\u0107mi\u0142y jego \u015bwietno\u015b\u0107. Dzi\u015b, kiedy obserwujemy r\u00f3wnoczesn\u0105 premier\u0119 <a href=\"https:\/\/github.com\/dropwizard\/dropwizard\/releases\/tag\/v3.0.0\">wersji 3.0<\/a> i <a href=\"https:\/\/github.com\/dropwizard\/dropwizard\/releases\/tag\/v4.0.0\">4.0<\/a>, to wydarzenie przechodzi bez echa w \u015bwiecie technologii, co tylko \u015bwiadczy o tym, jak bardzo zmieni\u0142a si\u0119 percepcja tego niegdy\u015b obiecuj\u0105cego projektu.<\/p>\n","innerContent":["\n<p>Pami\u0119tam czasy, gdy u\u017cywa\u0142em Dropwizarda, kiedy ten szumnie obiecuj\u0105cy framework znajdowa\u0142 si\u0119 na samym szczycie popularno\u015bci. Wydawa\u0142o mi si\u0119 wtedy, \u017ce to w\u0142a\u015bnie on zapowiada przysz\u0142o\u015b\u0107 tworzenia aplikacji internetowych i zostanie na d\u0142u\u017cej w \u015bwiadomo\u015bci programist\u00f3w. Niestety, \u017cycie i rynek potoczy\u0142y si\u0119 inaczej. Mimo pierwotnego entuzjazmu, DropWizard zacz\u0105\u0142 traci\u0107 na znaczeniu, a inne narz\u0119dzia i technologie przy\u0107mi\u0142y jego \u015bwietno\u015b\u0107. Dzi\u015b, kiedy obserwujemy r\u00f3wnoczesn\u0105 premier\u0119 <a href=\"https:\/\/github.com\/dropwizard\/dropwizard\/releases\/tag\/v3.0.0\">wersji 3.0<\/a> i <a href=\"https:\/\/github.com\/dropwizard\/dropwizard\/releases\/tag\/v4.0.0\">4.0<\/a>, to wydarzenie przechodzi bez echa w \u015bwiecie technologii, co tylko \u015bwiadczy o tym, jak bardzo zmieni\u0142a si\u0119 percepcja tego niegdy\u015b obiecuj\u0105cego projektu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co tak naprawd\u0119 przyci\u0105ga uwag\u0119, to wsp\u00f3lna premiera wersji 3 i 4, co mo\u017ce by\u0107 nieco myl\u0105ce. Pow\u00f3d dw\u00f3ch wersji jest prosty: Dropwizard 3.0.0 opiera si\u0119 na Java EE i przestrzeni nazw <code>javax.<\/code>, dzi\u0119ki czemu migracja z Dropwizard 2.x do wersji 3.0.0 powinna by\u0107 minimalna dla wielu projekt\u00f3w. Natomiast Dropwizard 4.0.0 opiera si\u0119 na zale\u017cno\u015bciach Jakarta EE oraz przestrzeni nazw <code>jakarta.<\/code>, co mo\u017ce wi\u0105za\u0107 si\u0119 z wi\u0119kszym nak\u0142adem pracy przy migracji z Dropwizard 2.x do wersji 4.0.0 ze wzgl\u0119du na wi\u0119cej zmian w pakietach i wi\u0119ksz\u0105 liczb\u0119 istotnych zmian w zale\u017cno\u015bciach.<\/p>\n","innerContent":["\n<p>Co tak naprawd\u0119 przyci\u0105ga uwag\u0119, to wsp\u00f3lna premiera wersji 3 i 4, co mo\u017ce by\u0107 nieco myl\u0105ce. Pow\u00f3d dw\u00f3ch wersji jest prosty: Dropwizard 3.0.0 opiera si\u0119 na Java EE i przestrzeni nazw <code>javax.<\/code>, dzi\u0119ki czemu migracja z Dropwizard 2.x do wersji 3.0.0 powinna by\u0107 minimalna dla wielu projekt\u00f3w. Natomiast Dropwizard 4.0.0 opiera si\u0119 na zale\u017cno\u015bciach Jakarta EE oraz przestrzeni nazw <code>jakarta.<\/code>, co mo\u017ce wi\u0105za\u0107 si\u0119 z wi\u0119kszym nak\u0142adem pracy przy migracji z Dropwizard 2.x do wersji 4.0.0 ze wzgl\u0119du na wi\u0119cej zmian w pakietach i wi\u0119ksz\u0105 liczb\u0119 istotnych zmian w zale\u017cno\u015bciach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Obie wersje \u0142\u0105czy te\u017c troch\u0119 wsp\u00f3lnych zmian - podniesienie wymaganej wersji Javy do 11, wprowadzenie struktury pakiet\u00f3w opartej o JPMS (mam wra\u017cenie, \u017ce to jedno z pierwszych narz\u0119dzi bior\u0105cych ten standard na powa\u017cnie), aktualizacj\u0119 Jetty do wersji 10.0.x (kt\u00f3ra te\u017c wymaga minimum Javy 11), aktualizacj\u0119 Apache HttpClient do wersji 5.x oraz usuni\u0119cie wsparcia dla JUnit 4.x (przeniesione do <code>dropwizard-testing-junit4<\/code>). Dodatkowo, Dropwizard 4.0 dostanie wsparcie dla Hibernate 6.0, wymagaj\u0105cego przej\u015bcia na <code>jakarta.<\/code><\/p>\n","innerContent":["\n<p>Obie wersje \u0142\u0105czy te\u017c troch\u0119 wsp\u00f3lnych zmian - podniesienie wymaganej wersji Javy do 11, wprowadzenie struktury pakiet\u00f3w opartej o JPMS (mam wra\u017cenie, \u017ce to jedno z pierwszych narz\u0119dzi bior\u0105cych ten standard na powa\u017cnie), aktualizacj\u0119 Jetty do wersji 10.0.x (kt\u00f3ra te\u017c wymaga minimum Javy 11), aktualizacj\u0119 Apache HttpClient do wersji 5.x oraz usuni\u0119cie wsparcia dla JUnit 4.x (przeniesione do <code>dropwizard-testing-junit4<\/code>). Dodatkowo, Dropwizard 4.0 dostanie wsparcie dla Hibernate 6.0, wymagaj\u0105cego przej\u015bcia na <code>jakarta.<\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15617,"width":512,"height":330,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png\" alt=\"\" class=\"wp-image-15617\" width=\"512\" height=\"330\"\/><figcaption class=\"wp-element-caption\">Ja wiem, \u017ce to nie jest a\u017c tak skomplikowane, ale dale przyda\u0142by si\u0119 jaki\u015b diagram<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png\" alt=\"\" class=\"wp-image-15617\" width=\"512\" height=\"330\"\/><figcaption class=\"wp-element-caption\">Ja wiem, \u017ce to nie jest a\u017c tak skomplikowane, ale dale przyda\u0142by si\u0119 jaki\u015b diagram<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Reakcja spo\u0142eczno\u015bci na Dropwizard 3.0 i 4.0 jest do\u015b\u0107 mieszana. Niekt\u00f3rzy programi\u015bci przyjmuj\u0105 nowe wydania z mo\u017ce nie ekscytacj\u0105, ale przynajmniej pewnym sentymentem (sam zaliczam si\u0119 do tego grona). Zagorzali fani Dropwizarda m\u00f3wi\u0105 o jego \"praktycznie pozbawionej b\u0142\u0119d\u00f3w\" naturze i wykorzystaniu sprawdzonych zale\u017cno\u015bci. Jest jak stary, przytulny sweter, kt\u00f3rego nie czujesz potrzeby wyrzuca\u0107 wyrzuci\u0107. Doceniaj\u0105 r\u00f3wnie\u017c to, \u017ce Dropwizard nie jest maniakiem kontroli, w przeciwie\u0144stwie do niekt\u00f3rych innych framework\u00f3w (ekh ekh, Spring Boot), pozwalaj\u0105c programistom miesza\u0107 i dopasowywa\u0107 komponenty do woli.<\/p>\n","innerContent":["\n<p>Reakcja spo\u0142eczno\u015bci na Dropwizard 3.0 i 4.0 jest do\u015b\u0107 mieszana. Niekt\u00f3rzy programi\u015bci przyjmuj\u0105 nowe wydania z mo\u017ce nie ekscytacj\u0105, ale przynajmniej pewnym sentymentem (sam zaliczam si\u0119 do tego grona). Zagorzali fani Dropwizarda m\u00f3wi\u0105 o jego \"praktycznie pozbawionej b\u0142\u0119d\u00f3w\" naturze i wykorzystaniu sprawdzonych zale\u017cno\u015bci. Jest jak stary, przytulny sweter, kt\u00f3rego nie czujesz potrzeby wyrzuca\u0107 wyrzuci\u0107. Doceniaj\u0105 r\u00f3wnie\u017c to, \u017ce Dropwizard nie jest maniakiem kontroli, w przeciwie\u0144stwie do niekt\u00f3rych innych framework\u00f3w (ekh ekh, Spring Boot), pozwalaj\u0105c programistom miesza\u0107 i dopasowywa\u0107 komponenty do woli.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>S\u0105 jednak i tacy, kt\u00f3rzy uwa\u017caj\u0105, \u017ce Dropwizard zaczyna pokazywa\u0107 sw\u00f3j wiek, podobnie jak telefon z klapk\u0105, kt\u00f3ry znalaz\u0142e\u015b w swojej szufladzie. Twierdz\u0105, \u017ce na scen\u0119 wkroczy\u0142y bardziej eleganckie i b\u0142yszcz\u0105ce frameworki, takie jak Micronaut, Quarkus i Helidon, oferuj\u0105ce wymy\u015blne funkcje, takie jak programowanie reaktywne, turbodo\u0142adowan\u0105 wydajno\u015b\u0107 i bycie Cloud-Native.<\/p>\n","innerContent":["\n<p>S\u0105 jednak i tacy, kt\u00f3rzy uwa\u017caj\u0105, \u017ce Dropwizard zaczyna pokazywa\u0107 sw\u00f3j wiek, podobnie jak telefon z klapk\u0105, kt\u00f3ry znalaz\u0142e\u015b w swojej szufladzie. Twierdz\u0105, \u017ce na scen\u0119 wkroczy\u0142y bardziej eleganckie i b\u0142yszcz\u0105ce frameworki, takie jak Micronaut, Quarkus i Helidon, oferuj\u0105ce wymy\u015blne funkcje, takie jak programowanie reaktywne, turbodo\u0142adowan\u0105 wydajno\u015b\u0107 i bycie Cloud-Native.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15622,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/yeah-i-member-memberberries.gif\" alt=\"\" class=\"wp-image-15622\"\/><figcaption class=\"wp-element-caption\">A kto\u015b z Was jeszcze pami\u0119ta Dropwizarda?<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/yeah-i-member-memberberries.gif\" alt=\"\" class=\"wp-image-15622\"\/><figcaption class=\"wp-element-caption\">A kto\u015b z Was jeszcze pami\u0119ta Dropwizarda?<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>4. Release Radar: Hibernate 6.20<\/h2>\n","innerContent":["\n<h2>4. Release Radar: Hibernate 6.20<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec jeszcze nowy Hibernate ORM 6.2.0 Final.<\/p>\n","innerContent":["\n<p>A na koniec jeszcze nowy Hibernate ORM 6.2.0 Final.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wydanie wprowadza strukturyzowane typy SQL, takie jak Struct, XML i JSON, co pozwala u\u017cytkownikom pracowa\u0107 z bardziej z\u0142o\u017conymi strukturami danych. Powi\u0105zanym z tym dodatkiem jest wsparcie dla Rekord\u00f3w, kt\u00f3re umo\u017cliwia Hibernate deserializacje wspomnianych typ\u00f3w strukturalnych w obie strony.<\/p>\n","innerContent":["\n<p>Wydanie wprowadza strukturyzowane typy SQL, takie jak Struct, XML i JSON, co pozwala u\u017cytkownikom pracowa\u0107 z bardziej z\u0142o\u017conymi strukturami danych. Powi\u0105zanym z tym dodatkiem jest wsparcie dla Rekord\u00f3w, kt\u00f3re umo\u017cliwia Hibernate deserializacje wspomnianych typ\u00f3w strukturalnych w obie strony.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wydanie to r\u00f3wnie\u017c ujednolica adnotacje s\u0142u\u017c\u0105ce do generowania warto\u015bci. Co wi\u0119cej, Hibernate oferuje teraz pe\u0142ne wsparcie dla partycji bazy danych za pomoc\u0105 adnotacji <code>@PartitionKey<\/code>, co upraszcza proces mapowania kolumn partycji.<\/p>\n","innerContent":["\n<p>Wydanie to r\u00f3wnie\u017c ujednolica adnotacje s\u0142u\u017c\u0105ce do generowania warto\u015bci. Co wi\u0119cej, Hibernate oferuje teraz pe\u0142ne wsparcie dla partycji bazy danych za pomoc\u0105 adnotacji <code>@PartitionKey<\/code>, co upraszcza proces mapowania kolumn partycji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ostatni\u0105 godn\u0105 uwagi funkcj\u0105 Hibernate ORM 6.2.0 jest implementacja SQL MERGE. Mechanizm ten dzia\u0142a w taki spos\u00f3b nieco zbli\u017cony do UPSERT. Jest jednak sporo pot\u0119\u017cniejszy, bowiem zamiast tylko aktualizowa\u0107, umo\u017cliwia r\u00f3wnie\u017c usuwanie rekord\u00f3w, a tak\u017ce umo\u017cliwia przekazanie dodatkowych warunk\u00f3w do zapytania, typu:<\/p>\n","innerContent":["\n<p>Ostatni\u0105 godn\u0105 uwagi funkcj\u0105 Hibernate ORM 6.2.0 jest implementacja SQL MERGE. Mechanizm ten dzia\u0142a w taki spos\u00f3b nieco zbli\u017cony do UPSERT. Jest jednak sporo pot\u0119\u017cniejszy, bowiem zamiast tylko aktualizowa\u0107, umo\u017cliwia r\u00f3wnie\u017c usuwanie rekord\u00f3w, a tak\u017ce umo\u017cliwia przekazanie dodatkowych warunk\u00f3w do zapytania, typu:<\/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>ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;\nON CONFLICT (country) DO NOTHING;<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;\nON CONFLICT (country) DO NOTHING;<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co prawda Hibernate u\u017cywa go w spos\u00f3b niewidoczny dla u\u017cytkownika ko\u0144cowego, ale mnie ta nowo\u015b\u0107 pozwoli\u0142a nieco poszerzy\u0107 swoj\u0105 wiedz\u0119 o SQL, wi\u0119c si\u0119 dziele.<\/p>\n","innerContent":["\n<p>Co prawda Hibernate u\u017cywa go w spos\u00f3b niewidoczny dla u\u017cytkownika ko\u0144cowego, ale mnie ta nowo\u015b\u0107 pozwoli\u0142a nieco poszerzy\u0107 swoj\u0105 wiedz\u0119 o SQL, wi\u0119c si\u0119 dziele.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15625,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-15625\"\/><figcaption class=\"wp-element-caption\">Mam wra\u017cenie \u017ce z SQL-em jest jak z Excelem - wszyscy krytykuj\u0105, u\u017cywaj\u0105c 10% jego mo\u017cliwo\u015bci.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-15625\"\/><figcaption class=\"wp-element-caption\">Mam wra\u017cenie \u017ce z SQL-em jest jak z Excelem - wszyscy krytykuj\u0105, u\u017cywaj\u0105c 10% jego mo\u017cliwo\u015bci.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A, i by\u0142 te\u017c Kotlin 1.8.20, ale jako \u017ce w przysz\u0142ym tygodniu b\u0119dzie KotlinConf, to tym tematem zajmiemy si\u0119 w nast\u0119pnej edycji, pewnie mocno kotlinowej.<\/p>\n","innerContent":["\n<p>A, i by\u0142 te\u017c Kotlin 1.8.20, ale jako \u017ce w przysz\u0142ym tygodniu b\u0119dzie KotlinConf, to tym tematem zajmiemy si\u0119 w nast\u0119pnej edycji, pewnie mocno kotlinowej.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15652","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=15652"}],"version-history":[{"count":8,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15652\/revisions"}],"predecessor-version":[{"id":15662,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15652\/revisions\/15662"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/15632"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=15652"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=15652"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=15652"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}