{"id":10181,"date":"2021-02-16T09:19:06","date_gmt":"2021-02-16T08:19:06","guid":{"rendered":"https:\/\/vived.io\/jvm-tuesday-vol-25\/"},"modified":"2022-09-19T13:10:56","modified_gmt":"2022-09-19T11:10:56","slug":"jvm-tuesday-vol-25","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/","title":{"rendered":"JVM Tuesday vol. 25"},"content":{"rendered":"<p>I sta\u0142o si\u0119, po niezwykle ekscytuj\u0105cym tygodniu poprzednim (z du\u017cymi wydaniami Kotlina i Javy oraz dyskusjami z tym zwi\u0105zanymi), tym razem&#8230; no c\u00f3\u017c, odrobin\u0119 posucha. Z czystym sumieniem ci\u0119\u017cko nam by\u0142o znale\u017a\u0107 a\u017c trzy dobre tematy do dzisiejszej edycji.<\/p>\n<p>Trzymamy si\u0119 wi\u0119c naszych zasad &#8211; nie chcemy pa\u015b\u0107 Waszego FOMO i dzieli\u0107 si\u0119 ma\u0142o interesuj\u0105cymi materia\u0142ami, tylko po to, aby wype\u0142ni\u0107 wiersz\u00f3weczk\u0119<\/p>\n<p>Po tym nieco przyd\u0142ugim wst\u0119pie, zapraszam do lektury!<\/p>\n<h2 id=\"1-jep-draft-frozen-arrays-preview\" data-num=1>1. <a href=\"https:\/\/openjdk.java.net\/jeps\/8261007\">JEP draft: Frozen Arrays (Preview)<\/a><\/h2>\n<p>JDK 16 ledwo otrzyma\u0142a swojego Release Candiate (a od czasu, kiedy o tym informowali\u015bmy, pojawi\u0142a si\u0119 ju\u017c jego druga iteracja), ale to nie znaczy, \u017ce architekci JVM wzi\u0119li sobie wolne. Kiedy my dyskutujemy nad wy\u017cszo\u015bci\u0105 Rekord\u00f3w nad Lombokiem, pojawiaj\u0105 si\u0119 nowe drafty funkcji. Zapewne b\u0119dziemy mieli okazj\u0119 pobawi\u0107 si\u0119 nimi dopiero w okolicach Javy 18 (co, bior\u0105c pod uwag\u0119 tempo wydawania nowych wyda\u0144 JDK, nie jest znowu jak\u0105\u015b niewyobra\u017calnie odleg\u0142\u0105 przysz\u0142o\u015bci\u0105).<\/p>\n<p>Nasz\u0105 ma\u0142\u0105 tradycj\u0105 sta\u0142o si\u0119 ju\u017c wy\u0142apywanie tych najbardziej interesuj\u0105cych zapowiedzi i nadawanie im nieco kontekstu. Dlatego te\u017c dzisiaj mamy dla Was tak zwane Frozen Arrays (bior\u0105c pod uwag\u0119 warunki pogodowe ci\u0119\u017cko by\u0142o chyba wybra\u0107 bardziej pasuj\u0105cego proposala). Jednak Frozen Array wpasowuj\u0105 si\u0119 nie tylko w ten do\u015b\u0107 mro\u017any luty, ale r\u00f3wnie\u017c w szeroko rozumiane programistyczne mody. Od paru lat nieprzerwanie trwa w naszej bran\u017cy trend w kierunku niemutowalno\u015bci. \u201cGrzebanie\u201d w obiektach staje si\u0119 symbolem z\u0142ego smaku, z jednej strony nie bez przyczyny (\u0142atwo jest wyeliminowa\u0107 ca\u0142e klasy b\u0142\u0119d\u00f3w zwi\u0105zane np. z wielow\u0105tkowo\u015bci\u0105), z drugiej strony ca\u0142o\u015b\u0107 przybiera czasem znamiona cargo cultu, jakich wiele w naszej bran\u017cy.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\" alt=\"\" \/><figcaption>Niechc\u0105cy odkry\u0142em, \u017ce to o czym pisz\u0119 ma w\u0142asn\u0105 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cargo_cult_programming\">stron\u0119 na Wikipedii<\/a>\u00a0<\/figcaption><\/figure>\n<p>Zalety niemutowalnych obiekt\u00f3w s\u0105 jednak na tyle praktyczne (oryginalny proposal wypisuje ich naprawd\u0119 d\u0142ug\u0105 list\u0119), \u017ce nasze j\u0119zyki prze\u015bcigaj\u0105 si\u0119 w zapewnianiu wsparcia dla tego paradygmatu (patrz\u0119 na Ciebie, Kotlinie). Celem \u201czamro\u017conych tablic\u201d jest udost\u0119pnienie wariantu klasycznych \u201carrajek\u201d blokuj\u0105cych blokuj\u0105cego mo\u017cliwo\u015b\u0107 p\u00f3\u017aniejszej podmiany istniej\u0105cych w niej element\u00f3w, czyli prostego przypisania \u00a0x[i]=y. Proponowana sk\u0142adnia nie jest jeszcze ostateczn\u0105, ale zaprezentowany wariant przypomina nieco <a href=\"https:\/\/developer.mozilla.org\/pl\/docs\/Web\/JavaScript\/Referencje\/Obiekty\/Object\/freeze\">Object.freeze<\/a> znany programistom JavaScripta:<\/p>\n<pre><code>T[] src = ...;\nT[] dest = System.arrayfreeze(src, 0, src.length);<\/code><\/pre>\n<p>Musz\u0119 przyzna\u0107, \u017ce na ten moment sk\u0142adnia nie jest zbyt urodziwa, ale proponowane jest jej \u201cdocukrzenie\u201d poprzez np. rozszerzenie interfejsu tablic o metod\u0119 .freeze. Pr\u00f3ba dokonania mutacji na tablicy ma rzuci\u0107 <em>ArrayStoreException<\/em> (co, liczyli\u015bcie \u017ce system typ\u00f3w Was przed tym uchroni? Naiwniacy ).<\/p>\n<p>To, co szczeg\u00f3lnie ciekawe w wypadku tego JEPa, to fakt, \u017ce niesie on za sob\u0105 wiele nieoczywistych reperkusji. Mutowalno\u015b\u0107 tablic jest czym\u015b tak g\u0142\u0119boko zakorzenionym w samej strukturze maszyny wirtualnej, \u017ce do implementacji wspomnianej zmiany potrzebne mo\u017ce by\u0107 wprowadzenie poprawek w Java Memory Modelu. Jest to jednak zwi\u0105zane g\u0142\u00f3wnie z faktem otwieraj\u0105cych si\u0119 przed tw\u00f3rcami JVM nowych potencjalnych poprawek, gdy\u017c zmro\u017cone tablice b\u0119d\u0105 \u201cefektywnie finalne\u201d, co pozwala na pewne agresywniejsze optymalizacje.<\/p>\n<p>Jak zwykle polecamy lektur\u0119 ca\u0142ego JEPa, kt\u00f3ry zawieraj\u0105cego mas\u0119 dodatkowych szczeg\u00f3\u0142\u00f3w na \u201cdla ch\u0119tnych.\u201d<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e14047c1.png\" alt=\"\" \/><figcaption>Kryptyczna wrzutka: Jeden z tych dw\u00f3ch pan\u00f3w by\u0142 moim role-modelem w dzieci\u0144stwie, a drugi nazywa si\u0119 Anianiasz<\/figcaption><\/figure>\n<h3 id=\"-r-d-a-\">\u0179r\u00f3d\u0142a:<\/h3>\n<ul>\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/8261007\">JEP draft: Frozen Arrays (Preview)<\/a><\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/pl\/docs\/Web\/JavaScript\/Referencje\/Obiekty\/Object\/freeze\">MDN: Object.freeze()<\/a><\/li>\n<\/ul>\n<h2 id=\"2-przeglad-rozwiazan-do-tworzenia-desktopowych-aplikacji-na-jvm\" data-num=2>2. Przegl\u0105d rozwi\u0105za\u0144 do tworzenia desktopowych aplikacji na JVM<\/h2>\n<p>Od pewnego czasu w zasta\u0142ym nieco \u015bwiecie JVMowych aplikacji desktopowych, pojawia si\u0119 zaskakuj\u0105co du\u017co inicjatyw. W przeci\u0105gu kwarta\u0142u dostali\u015bmy cho\u0107by now\u0105 edycj\u0119 JavyFX, a Jetbrains wypu\u015bci\u0142o Jetpack Compose for Desktop &#8211; troch\u0119 nawet korci\u0142o mnie, \u017ceby przygotowa\u0107 tekst w jaki\u015b spos\u00f3b je podsumowuj\u0105cy. Oczywi\u015bcie, w czasie kiedy ja si\u0119 nad tym zastanawia\u0142em, kto\u015b inny po prostu siad\u0142 i to zrobi\u0142, a mi pozosta\u0142o tylko przekaza\u0107 Wam o tym informacje.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e14eb6d7.gif\" alt=\"\" \/><\/figure>\n<p>Tym kim\u015b jest jednak nie kto inny ni\u017c Nicolas Fr\u00e4nkel. Jest to autor niepozornego bloga <a href=\"https:\/\/blog.frankel.ch\/\">A Java Geek<\/a>, kt\u00f3ry nieprzerwanie od lat pozostaje jednym z najlepszych \u017ar\u00f3de\u0142 powi\u0105zanych z JVMem, zawsze z raczej nieszablonowanymi opracowaniami. Od pocz\u0105tku roku tworzy on kolejne wpisy w ramach serii <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/6\/\"><strong>The state of JVM desktop frameworks<\/strong><\/a>. Opracowa\u0142 ju\u017c <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/2\/\">Swinga<\/a>, <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/3\/\">SWT<\/a> (budulec Eclipse), <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/4\/\">TornadoFX<\/a> (Framework JavaFX z bindingami do Koltina) oraz <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/5\/\">Jetpack Compose<\/a>. Ka\u017cdy z post\u00f3w blogowych \u0142apie bardzo dobry balans mi\u0119dzy wyczerpaniem tematu na tyle, \u017ce czytelnik pozostaje z poczuciem zrozumienia wad i zalet ka\u017cdego z rozwi\u0105za\u0144, a wchodzeniem nadmiernie w szczeg\u00f3\u0142y.<\/p>\n<p>Jednak to w\u0142a\u015bnie najnowsza, <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/1\/\">sz\u00f3sta cz\u0119\u015b\u0107<\/a> szczeg\u00f3lnie uj\u0119\u0142a moje serduszko. Ot\u00f3\u017c autor postanowi\u0142 przej\u015b\u0107 w niej przez najr\u00f3\u017cniejsze sposoby udost\u0119pniania Javowej aplikacji klientom. Prezentuje w niej takie historyczne artefakty jak Applety, czy te\u017c Java Web Start (a w\u0142a\u015bciwie jego otwart\u0105 wersj\u0119 Open Web Start) \u2013 rozwi\u0105zania \u015bwi\u0119c\u0105ce tryumfy w czasach, gdy internet dopiero raczkowa\u0142 (cho\u0107 nie b\u0119d\u0119 ukrywa\u0142, \u017ce sam jeszcze mia\u0142em okazj\u0119, w czasie swojej nie tak d\u0142ugiej przecie\u017c kariery, utrzymywa\u0107 aplikacj\u0119 dystrybuowan\u0105 w WebStartowym formacie JNLP). Dla niejednej osoby b\u0119dzie to ciekawa lekcja historii.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1560c10.gif\" alt=\"\" \/><figcaption>Ja pewnie nie b\u0119d\u0119 spa\u0142 po nocy przez kilka dni.<\/figcaption><\/figure>\n<p>Dla tych za\u015b, co szukaj\u0105 czego\u015b, co w 2021 roku b\u0119dzie wygl\u0105da\u0142o, jak rozwi\u0105zanie wyrwane z muzemu, Nicolas prezentuje <a href=\"https:\/\/openjdk.java.net\/jeps\/392\">jpackage<\/a> (kt\u00f3rej to stabilne wydanie zostanie opublikowane wraz z JDK 16) oraz pokazuje, jak u\u017cywaj\u0105c mechanizmu jlink napisa\u0107 prosty skrypt uruchomieniowy dla Waszego modu\u0142u. Na koniec te\u017c szybko przechodzi przez bonusow\u0105 list\u0119 alternatywnych projekt\u00f3w, kt\u00f3re uda\u0142o mu si\u0119 odnale\u017a\u0107 podczas researchu do artyku\u0142u. \u00a0I to w\u0142a\u015bnie ta zwi\u0119z\u0142o\u015b\u0107 i przekrojowo\u015b\u0107 sprawia, \u017ce nawet, je\u015bli nie zamierzasz pisa\u0107 w najbli\u017cszym czasie desktopowych aplikacji, to jest to \u015bwietna okazja, \u017ceby od\u015bwie\u017cy\u0107 sobie nieco temat.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e15cb4e6.gif\" alt=\"\" \/><figcaption>Cho\u0107by na sytuacj\u0119, gdy \u015bwiat przejrzy na oczy i postanowi pozby\u0107 si\u0119 wszelkich elektronowych aberracji.<\/figcaption><\/figure>\n<h3 id=\"-r-d-a--1\">\u0179r\u00f3d\u0142a:<\/h3>\n<ul>\n<li><a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/1\/\" rel=\"noopener\">The state of JVM desktop frameworks<\/a><\/li>\n<li><a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/6\/\">Distribution of JVM desktop applications<\/a><\/li>\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/392\">JEP 392: Packaging Tool<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj tylko dwa tematy \u2013 nowy JEP, a tak\u017ce swoiste podsumowanie bardzo interesuj\u0105cego cyklu na temat tego, jak w 2021 roku pisze si\u0119 desktopowe aplikacje w Javie.<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-10181","post","type-post","status-publish","format-standard","hentry","category-jvm-pl"],"acf":{"weekly_summary":true,"estimated_reading_time":"5"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JVM Tuesday vol. 25 - 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\/jvm-tuesday-vol-25\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Tuesday vol. 25 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj tylko dwa tematy \u2013 nowy JEP, a tak\u017ce swoiste podsumowanie bardzo interesuj\u0105cego cyklu na temat tego, jak w 2021 roku pisze si\u0119 desktopowe aplikacje w Javie.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-16T08:19:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.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\/jvm-tuesday-vol-25\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Tuesday vol. 25\",\"datePublished\":\"2021-02-16T08:19:06+00:00\",\"dateModified\":\"2022-09-19T11:10:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/\"},\"wordCount\":1029,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/\",\"name\":\"JVM Tuesday vol. 25 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\",\"datePublished\":\"2021-02-16T08:19:06+00:00\",\"dateModified\":\"2022-09-19T11:10:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Tuesday vol. 25\"}]},{\"@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":"JVM Tuesday vol. 25 - 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\/jvm-tuesday-vol-25\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Tuesday vol. 25 - Vived","og_description":"Dzisiaj tylko dwa tematy \u2013 nowy JEP, a tak\u017ce swoiste podsumowanie bardzo interesuj\u0105cego cyklu na temat tego, jak w 2021 roku pisze si\u0119 desktopowe aplikacje w Javie.","og_url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/","og_site_name":"Vived","article_published_time":"2021-02-16T08:19:06+00:00","article_modified_time":"2022-09-19T11:10:56+00:00","og_image":[{"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png","type":"","width":"","height":""}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Tuesday vol. 25","datePublished":"2021-02-16T08:19:06+00:00","dateModified":"2022-09-19T11:10:56+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/"},"wordCount":1029,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png","articleSection":["JVM"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/","url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/","name":"JVM Tuesday vol. 25 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png","datePublished":"2021-02-16T08:19:06+00:00","dateModified":"2022-09-19T11:10:56+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png"},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-25\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Tuesday vol. 25"}]},{"@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":null,"attrs":[],"innerBlocks":[],"innerHTML":"I sta\u0142o si\u0119, po niezwykle ekscytuj\u0105cym tygodniu poprzednim (z du\u017cymi wydaniami Kotlina i Javy oraz dyskusjami z tym zwi\u0105zanymi), tym razem... no c\u00f3\u017c, odrobin\u0119 posucha. Z czystym sumieniem ci\u0119\u017cko nam by\u0142o znale\u017a\u0107 a\u017c trzy dobre tematy do dzisiejszej edycji.\n\nTrzymamy si\u0119 wi\u0119c naszych zasad - nie chcemy pa\u015b\u0107 Waszego FOMO i dzieli\u0107 si\u0119 ma\u0142o interesuj\u0105cymi materia\u0142ami, tylko po to, aby wype\u0142ni\u0107 wiersz\u00f3weczk\u0119\n\nPo tym nieco przyd\u0142ugim wst\u0119pie, zapraszam do lektury!\n<h2 id=\"1-jep-draft-frozen-arrays-preview-\">1. <a href=\"https:\/\/openjdk.java.net\/jeps\/8261007\">JEP draft: Frozen Arrays (Preview)<\/a><\/h2>\nJDK 16 ledwo otrzyma\u0142a swojego Release Candiate (a od czasu, kiedy o tym informowali\u015bmy, pojawi\u0142a si\u0119 ju\u017c jego druga iteracja), ale to nie znaczy, \u017ce architekci JVM wzi\u0119li sobie wolne. Kiedy my dyskutujemy nad wy\u017cszo\u015bci\u0105 Rekord\u00f3w nad Lombokiem, pojawiaj\u0105 si\u0119 nowe drafty funkcji. Zapewne b\u0119dziemy mieli okazj\u0119 pobawi\u0107 si\u0119 nimi dopiero w okolicach Javy 18 (co, bior\u0105c pod uwag\u0119 tempo wydawania nowych wyda\u0144 JDK, nie jest znowu jak\u0105\u015b niewyobra\u017calnie odleg\u0142\u0105 przysz\u0142o\u015bci\u0105).\n\nNasz\u0105 ma\u0142\u0105 tradycj\u0105 sta\u0142o si\u0119 ju\u017c wy\u0142apywanie tych najbardziej interesuj\u0105cych zapowiedzi i nadawanie im nieco kontekstu. Dlatego te\u017c dzisiaj mamy dla Was tak zwane Frozen Arrays (bior\u0105c pod uwag\u0119 warunki pogodowe ci\u0119\u017cko by\u0142o chyba wybra\u0107 bardziej pasuj\u0105cego proposala). Jednak Frozen Array wpasowuj\u0105 si\u0119 nie tylko w ten do\u015b\u0107 mro\u017any luty, ale r\u00f3wnie\u017c w szeroko rozumiane programistyczne mody. Od paru lat nieprzerwanie trwa w naszej bran\u017cy trend w kierunku niemutowalno\u015bci. \u201cGrzebanie\u201d w obiektach staje si\u0119 symbolem z\u0142ego smaku, z jednej strony nie bez przyczyny (\u0142atwo jest wyeliminowa\u0107 ca\u0142e klasy b\u0142\u0119d\u00f3w zwi\u0105zane np. z wielow\u0105tkowo\u015bci\u0105), z drugiej strony ca\u0142o\u015b\u0107 przybiera czasem znamiona cargo cultu, jakich wiele w naszej bran\u017cy.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\" alt=\"\" \/>\n<figcaption>Niechc\u0105cy odkry\u0142em, \u017ce to o czym pisz\u0119 ma w\u0142asn\u0105 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cargo_cult_programming\">stron\u0119 na Wikipedii<\/a>\u00a0<\/figcaption><\/figure>\nZalety niemutowalnych obiekt\u00f3w s\u0105 jednak na tyle praktyczne (oryginalny proposal wypisuje ich naprawd\u0119 d\u0142ug\u0105 list\u0119), \u017ce nasze j\u0119zyki prze\u015bcigaj\u0105 si\u0119 w zapewnianiu wsparcia dla tego paradygmatu (patrz\u0119 na Ciebie, Kotlinie). Celem \u201czamro\u017conych tablic\u201d jest udost\u0119pnienie wariantu klasycznych \u201carrajek\u201d blokuj\u0105cych blokuj\u0105cego mo\u017cliwo\u015b\u0107 p\u00f3\u017aniejszej podmiany istniej\u0105cych w niej element\u00f3w, czyli prostego przypisania \u00a0x[i]=y. Proponowana sk\u0142adnia nie jest jeszcze ostateczn\u0105, ale zaprezentowany wariant przypomina nieco <a href=\"https:\/\/developer.mozilla.org\/pl\/docs\/Web\/JavaScript\/Referencje\/Obiekty\/Object\/freeze\">Object.freeze<\/a> znany programistom JavaScripta:\n<pre><code>T[] src = ...;\nT[] dest = System.arrayfreeze(src, 0, src.length);<\/code><\/pre>\nMusz\u0119 przyzna\u0107, \u017ce na ten moment sk\u0142adnia nie jest zbyt urodziwa, ale proponowane jest jej \u201cdocukrzenie\u201d poprzez np. rozszerzenie interfejsu tablic o metod\u0119 .freeze. Pr\u00f3ba dokonania mutacji na tablicy ma rzuci\u0107 <em>ArrayStoreException<\/em> (co, liczyli\u015bcie \u017ce system typ\u00f3w Was przed tym uchroni? Naiwniacy ).\n\nTo, co szczeg\u00f3lnie ciekawe w wypadku tego JEPa, to fakt, \u017ce niesie on za sob\u0105 wiele nieoczywistych reperkusji. Mutowalno\u015b\u0107 tablic jest czym\u015b tak g\u0142\u0119boko zakorzenionym w samej strukturze maszyny wirtualnej, \u017ce do implementacji wspomnianej zmiany potrzebne mo\u017ce by\u0107 wprowadzenie poprawek w Java Memory Modelu. Jest to jednak zwi\u0105zane g\u0142\u00f3wnie z faktem otwieraj\u0105cych si\u0119 przed tw\u00f3rcami JVM nowych potencjalnych poprawek, gdy\u017c zmro\u017cone tablice b\u0119d\u0105 \u201cefektywnie finalne\u201d, co pozwala na pewne agresywniejsze optymalizacje.\n\nJak zwykle polecamy lektur\u0119 ca\u0142ego JEPa, kt\u00f3ry zawieraj\u0105cego mas\u0119 dodatkowych szczeg\u00f3\u0142\u00f3w na \u201cdla ch\u0119tnych.\u201d\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e14047c1.png\" alt=\"\" \/>\n\n<figcaption>Kryptyczna wrzutka: Jeden z tych dw\u00f3ch pan\u00f3w by\u0142 moim role-modelem w dzieci\u0144stwie, a drugi nazywa si\u0119 Anianiasz<\/figcaption><\/figure>\n<h3 id=\"-r-d-a-\">\u0179r\u00f3d\u0142a:<\/h3>\n<ul>\n \t<li><a href=\"https:\/\/openjdk.java.net\/jeps\/8261007\">JEP draft: Frozen Arrays (Preview)<\/a><\/li>\n \t<li><a href=\"https:\/\/developer.mozilla.org\/pl\/docs\/Web\/JavaScript\/Referencje\/Obiekty\/Object\/freeze\">MDN: Object.freeze()<\/a><\/li>\n<\/ul>\n<h2 id=\"2-przegl-d-rozwi-za-do-tworzenia-desktopowych-aplikacji-na-jvm-\">2. Przegl\u0105d rozwi\u0105za\u0144 do tworzenia desktopowych aplikacji na JVM<\/h2>\nOd pewnego czasu w zasta\u0142ym nieco \u015bwiecie JVMowych aplikacji desktopowych, pojawia si\u0119 zaskakuj\u0105co du\u017co inicjatyw. W przeci\u0105gu kwarta\u0142u dostali\u015bmy cho\u0107by now\u0105 edycj\u0119 JavyFX, a Jetbrains wypu\u015bci\u0142o Jetpack Compose for Desktop - troch\u0119 nawet korci\u0142o mnie, \u017ceby przygotowa\u0107 tekst w jaki\u015b spos\u00f3b je podsumowuj\u0105cy. Oczywi\u015bcie, w czasie kiedy ja si\u0119 nad tym zastanawia\u0142em, kto\u015b inny po prostu siad\u0142 i to zrobi\u0142, a mi pozosta\u0142o tylko przekaza\u0107 Wam o tym informacje.\n<figure class=\"kg-card kg-image-card\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e14eb6d7.gif\" alt=\"\" \/><\/figure>\nTym kim\u015b jest jednak nie kto inny ni\u017c Nicolas Fr\u00e4nkel. Jest to autor niepozornego bloga <a href=\"https:\/\/blog.frankel.ch\/\">A Java Geek<\/a>, kt\u00f3ry nieprzerwanie od lat pozostaje jednym z najlepszych \u017ar\u00f3de\u0142 powi\u0105zanych z JVMem, zawsze z raczej nieszablonowanymi opracowaniami. Od pocz\u0105tku roku tworzy on kolejne wpisy w ramach serii <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/6\/\"><strong>The state of JVM desktop frameworks<\/strong><\/a>. Opracowa\u0142 ju\u017c <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/2\/\">Swinga<\/a>, <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/3\/\">SWT<\/a> (budulec Eclipse), <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/4\/\">TornadoFX<\/a> (Framework JavaFX z bindingami do Koltina) oraz <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/5\/\">Jetpack Compose<\/a>. Ka\u017cdy z post\u00f3w blogowych \u0142apie bardzo dobry balans mi\u0119dzy wyczerpaniem tematu na tyle, \u017ce czytelnik pozostaje z poczuciem zrozumienia wad i zalet ka\u017cdego z rozwi\u0105za\u0144, a wchodzeniem nadmiernie w szczeg\u00f3\u0142y.\n\nJednak to w\u0142a\u015bnie najnowsza, <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/1\/\">sz\u00f3sta cz\u0119\u015b\u0107<\/a> szczeg\u00f3lnie uj\u0119\u0142a moje serduszko. Ot\u00f3\u017c autor postanowi\u0142 przej\u015b\u0107 w niej przez najr\u00f3\u017cniejsze sposoby udost\u0119pniania Javowej aplikacji klientom. Prezentuje w niej takie historyczne artefakty jak Applety, czy te\u017c Java Web Start (a w\u0142a\u015bciwie jego otwart\u0105 wersj\u0119 Open Web Start) \u2013 rozwi\u0105zania \u015bwi\u0119c\u0105ce tryumfy w czasach, gdy internet dopiero raczkowa\u0142 (cho\u0107 nie b\u0119d\u0119 ukrywa\u0142, \u017ce sam jeszcze mia\u0142em okazj\u0119, w czasie swojej nie tak d\u0142ugiej przecie\u017c kariery, utrzymywa\u0107 aplikacj\u0119 dystrybuowan\u0105 w WebStartowym formacie JNLP). Dla niejednej osoby b\u0119dzie to ciekawa lekcja historii.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1560c10.gif\" alt=\"\" \/>\n\n<figcaption>Ja pewnie nie b\u0119d\u0119 spa\u0142 po nocy przez kilka dni.<\/figcaption><\/figure>\nDla tych za\u015b, co szukaj\u0105 czego\u015b, co w 2021 roku b\u0119dzie wygl\u0105da\u0142o, jak rozwi\u0105zanie wyrwane z muzemu, Nicolas prezentuje <a href=\"https:\/\/openjdk.java.net\/jeps\/392\">jpackage<\/a> (kt\u00f3rej to stabilne wydanie zostanie opublikowane wraz z JDK 16) oraz pokazuje, jak u\u017cywaj\u0105c mechanizmu jlink napisa\u0107 prosty skrypt uruchomieniowy dla Waszego modu\u0142u. Na koniec te\u017c szybko przechodzi przez bonusow\u0105 list\u0119 alternatywnych projekt\u00f3w, kt\u00f3re uda\u0142o mu si\u0119 odnale\u017a\u0107 podczas researchu do artyku\u0142u. \u00a0I to w\u0142a\u015bnie ta zwi\u0119z\u0142o\u015b\u0107 i przekrojowo\u015b\u0107 sprawia, \u017ce nawet, je\u015bli nie zamierzasz pisa\u0107 w najbli\u017cszym czasie desktopowych aplikacji, to jest to \u015bwietna okazja, \u017ceby od\u015bwie\u017cy\u0107 sobie nieco temat.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e15cb4e6.gif\" alt=\"\" \/>\n\n<figcaption>Cho\u0107by na sytuacj\u0119, gdy \u015bwiat przejrzy na oczy i postanowi pozby\u0107 si\u0119 wszelkich elektronowych aberracji.<\/figcaption><\/figure>\n<h3 id=\"-r-d-a--1\">\u0179r\u00f3d\u0142a:<\/h3>\n<ul>\n \t<li><a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/1\/\" rel=\"noopener\">The state of JVM desktop frameworks<\/a><\/li>\n \t<li><a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/6\/\">Distribution of JVM desktop applications<\/a><\/li>\n \t<li><a href=\"https:\/\/openjdk.java.net\/jeps\/392\">JEP 392: Packaging Tool<\/a><\/li>\n<\/ul>","innerContent":["I sta\u0142o si\u0119, po niezwykle ekscytuj\u0105cym tygodniu poprzednim (z du\u017cymi wydaniami Kotlina i Javy oraz dyskusjami z tym zwi\u0105zanymi), tym razem... no c\u00f3\u017c, odrobin\u0119 posucha. Z czystym sumieniem ci\u0119\u017cko nam by\u0142o znale\u017a\u0107 a\u017c trzy dobre tematy do dzisiejszej edycji.\n\nTrzymamy si\u0119 wi\u0119c naszych zasad - nie chcemy pa\u015b\u0107 Waszego FOMO i dzieli\u0107 si\u0119 ma\u0142o interesuj\u0105cymi materia\u0142ami, tylko po to, aby wype\u0142ni\u0107 wiersz\u00f3weczk\u0119\n\nPo tym nieco przyd\u0142ugim wst\u0119pie, zapraszam do lektury!\n<h2 id=\"1-jep-draft-frozen-arrays-preview-\">1. <a href=\"https:\/\/openjdk.java.net\/jeps\/8261007\">JEP draft: Frozen Arrays (Preview)<\/a><\/h2>\nJDK 16 ledwo otrzyma\u0142a swojego Release Candiate (a od czasu, kiedy o tym informowali\u015bmy, pojawi\u0142a si\u0119 ju\u017c jego druga iteracja), ale to nie znaczy, \u017ce architekci JVM wzi\u0119li sobie wolne. Kiedy my dyskutujemy nad wy\u017cszo\u015bci\u0105 Rekord\u00f3w nad Lombokiem, pojawiaj\u0105 si\u0119 nowe drafty funkcji. Zapewne b\u0119dziemy mieli okazj\u0119 pobawi\u0107 si\u0119 nimi dopiero w okolicach Javy 18 (co, bior\u0105c pod uwag\u0119 tempo wydawania nowych wyda\u0144 JDK, nie jest znowu jak\u0105\u015b niewyobra\u017calnie odleg\u0142\u0105 przysz\u0142o\u015bci\u0105).\n\nNasz\u0105 ma\u0142\u0105 tradycj\u0105 sta\u0142o si\u0119 ju\u017c wy\u0142apywanie tych najbardziej interesuj\u0105cych zapowiedzi i nadawanie im nieco kontekstu. Dlatego te\u017c dzisiaj mamy dla Was tak zwane Frozen Arrays (bior\u0105c pod uwag\u0119 warunki pogodowe ci\u0119\u017cko by\u0142o chyba wybra\u0107 bardziej pasuj\u0105cego proposala). Jednak Frozen Array wpasowuj\u0105 si\u0119 nie tylko w ten do\u015b\u0107 mro\u017any luty, ale r\u00f3wnie\u017c w szeroko rozumiane programistyczne mody. Od paru lat nieprzerwanie trwa w naszej bran\u017cy trend w kierunku niemutowalno\u015bci. \u201cGrzebanie\u201d w obiektach staje si\u0119 symbolem z\u0142ego smaku, z jednej strony nie bez przyczyny (\u0142atwo jest wyeliminowa\u0107 ca\u0142e klasy b\u0142\u0119d\u00f3w zwi\u0105zane np. z wielow\u0105tkowo\u015bci\u0105), z drugiej strony ca\u0142o\u015b\u0107 przybiera czasem znamiona cargo cultu, jakich wiele w naszej bran\u017cy.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1355544.png\" alt=\"\" \/>\n<figcaption>Niechc\u0105cy odkry\u0142em, \u017ce to o czym pisz\u0119 ma w\u0142asn\u0105 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cargo_cult_programming\">stron\u0119 na Wikipedii<\/a>\u00a0<\/figcaption><\/figure>\nZalety niemutowalnych obiekt\u00f3w s\u0105 jednak na tyle praktyczne (oryginalny proposal wypisuje ich naprawd\u0119 d\u0142ug\u0105 list\u0119), \u017ce nasze j\u0119zyki prze\u015bcigaj\u0105 si\u0119 w zapewnianiu wsparcia dla tego paradygmatu (patrz\u0119 na Ciebie, Kotlinie). Celem \u201czamro\u017conych tablic\u201d jest udost\u0119pnienie wariantu klasycznych \u201carrajek\u201d blokuj\u0105cych blokuj\u0105cego mo\u017cliwo\u015b\u0107 p\u00f3\u017aniejszej podmiany istniej\u0105cych w niej element\u00f3w, czyli prostego przypisania \u00a0x[i]=y. Proponowana sk\u0142adnia nie jest jeszcze ostateczn\u0105, ale zaprezentowany wariant przypomina nieco <a href=\"https:\/\/developer.mozilla.org\/pl\/docs\/Web\/JavaScript\/Referencje\/Obiekty\/Object\/freeze\">Object.freeze<\/a> znany programistom JavaScripta:\n<pre><code>T[] src = ...;\nT[] dest = System.arrayfreeze(src, 0, src.length);<\/code><\/pre>\nMusz\u0119 przyzna\u0107, \u017ce na ten moment sk\u0142adnia nie jest zbyt urodziwa, ale proponowane jest jej \u201cdocukrzenie\u201d poprzez np. rozszerzenie interfejsu tablic o metod\u0119 .freeze. Pr\u00f3ba dokonania mutacji na tablicy ma rzuci\u0107 <em>ArrayStoreException<\/em> (co, liczyli\u015bcie \u017ce system typ\u00f3w Was przed tym uchroni? Naiwniacy ).\n\nTo, co szczeg\u00f3lnie ciekawe w wypadku tego JEPa, to fakt, \u017ce niesie on za sob\u0105 wiele nieoczywistych reperkusji. Mutowalno\u015b\u0107 tablic jest czym\u015b tak g\u0142\u0119boko zakorzenionym w samej strukturze maszyny wirtualnej, \u017ce do implementacji wspomnianej zmiany potrzebne mo\u017ce by\u0107 wprowadzenie poprawek w Java Memory Modelu. Jest to jednak zwi\u0105zane g\u0142\u00f3wnie z faktem otwieraj\u0105cych si\u0119 przed tw\u00f3rcami JVM nowych potencjalnych poprawek, gdy\u017c zmro\u017cone tablice b\u0119d\u0105 \u201cefektywnie finalne\u201d, co pozwala na pewne agresywniejsze optymalizacje.\n\nJak zwykle polecamy lektur\u0119 ca\u0142ego JEPa, kt\u00f3ry zawieraj\u0105cego mas\u0119 dodatkowych szczeg\u00f3\u0142\u00f3w na \u201cdla ch\u0119tnych.\u201d\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e14047c1.png\" alt=\"\" \/>\n\n<figcaption>Kryptyczna wrzutka: Jeden z tych dw\u00f3ch pan\u00f3w by\u0142 moim role-modelem w dzieci\u0144stwie, a drugi nazywa si\u0119 Anianiasz<\/figcaption><\/figure>\n<h3 id=\"-r-d-a-\">\u0179r\u00f3d\u0142a:<\/h3>\n<ul>\n \t<li><a href=\"https:\/\/openjdk.java.net\/jeps\/8261007\">JEP draft: Frozen Arrays (Preview)<\/a><\/li>\n \t<li><a href=\"https:\/\/developer.mozilla.org\/pl\/docs\/Web\/JavaScript\/Referencje\/Obiekty\/Object\/freeze\">MDN: Object.freeze()<\/a><\/li>\n<\/ul>\n<h2 id=\"2-przegl-d-rozwi-za-do-tworzenia-desktopowych-aplikacji-na-jvm-\">2. Przegl\u0105d rozwi\u0105za\u0144 do tworzenia desktopowych aplikacji na JVM<\/h2>\nOd pewnego czasu w zasta\u0142ym nieco \u015bwiecie JVMowych aplikacji desktopowych, pojawia si\u0119 zaskakuj\u0105co du\u017co inicjatyw. W przeci\u0105gu kwarta\u0142u dostali\u015bmy cho\u0107by now\u0105 edycj\u0119 JavyFX, a Jetbrains wypu\u015bci\u0142o Jetpack Compose for Desktop - troch\u0119 nawet korci\u0142o mnie, \u017ceby przygotowa\u0107 tekst w jaki\u015b spos\u00f3b je podsumowuj\u0105cy. Oczywi\u015bcie, w czasie kiedy ja si\u0119 nad tym zastanawia\u0142em, kto\u015b inny po prostu siad\u0142 i to zrobi\u0142, a mi pozosta\u0142o tylko przekaza\u0107 Wam o tym informacje.\n<figure class=\"kg-card kg-image-card\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e14eb6d7.gif\" alt=\"\" \/><\/figure>\nTym kim\u015b jest jednak nie kto inny ni\u017c Nicolas Fr\u00e4nkel. Jest to autor niepozornego bloga <a href=\"https:\/\/blog.frankel.ch\/\">A Java Geek<\/a>, kt\u00f3ry nieprzerwanie od lat pozostaje jednym z najlepszych \u017ar\u00f3de\u0142 powi\u0105zanych z JVMem, zawsze z raczej nieszablonowanymi opracowaniami. Od pocz\u0105tku roku tworzy on kolejne wpisy w ramach serii <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/6\/\"><strong>The state of JVM desktop frameworks<\/strong><\/a>. Opracowa\u0142 ju\u017c <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/2\/\">Swinga<\/a>, <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/3\/\">SWT<\/a> (budulec Eclipse), <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/4\/\">TornadoFX<\/a> (Framework JavaFX z bindingami do Koltina) oraz <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/5\/\">Jetpack Compose<\/a>. Ka\u017cdy z post\u00f3w blogowych \u0142apie bardzo dobry balans mi\u0119dzy wyczerpaniem tematu na tyle, \u017ce czytelnik pozostaje z poczuciem zrozumienia wad i zalet ka\u017cdego z rozwi\u0105za\u0144, a wchodzeniem nadmiernie w szczeg\u00f3\u0142y.\n\nJednak to w\u0142a\u015bnie najnowsza, <a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/1\/\">sz\u00f3sta cz\u0119\u015b\u0107<\/a> szczeg\u00f3lnie uj\u0119\u0142a moje serduszko. Ot\u00f3\u017c autor postanowi\u0142 przej\u015b\u0107 w niej przez najr\u00f3\u017cniejsze sposoby udost\u0119pniania Javowej aplikacji klientom. Prezentuje w niej takie historyczne artefakty jak Applety, czy te\u017c Java Web Start (a w\u0142a\u015bciwie jego otwart\u0105 wersj\u0119 Open Web Start) \u2013 rozwi\u0105zania \u015bwi\u0119c\u0105ce tryumfy w czasach, gdy internet dopiero raczkowa\u0142 (cho\u0107 nie b\u0119d\u0119 ukrywa\u0142, \u017ce sam jeszcze mia\u0142em okazj\u0119, w czasie swojej nie tak d\u0142ugiej przecie\u017c kariery, utrzymywa\u0107 aplikacj\u0119 dystrybuowan\u0105 w WebStartowym formacie JNLP). Dla niejednej osoby b\u0119dzie to ciekawa lekcja historii.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e1560c10.gif\" alt=\"\" \/>\n\n<figcaption>Ja pewnie nie b\u0119d\u0119 spa\u0142 po nocy przez kilka dni.<\/figcaption><\/figure>\nDla tych za\u015b, co szukaj\u0105 czego\u015b, co w 2021 roku b\u0119dzie wygl\u0105da\u0142o, jak rozwi\u0105zanie wyrwane z muzemu, Nicolas prezentuje <a href=\"https:\/\/openjdk.java.net\/jeps\/392\">jpackage<\/a> (kt\u00f3rej to stabilne wydanie zostanie opublikowane wraz z JDK 16) oraz pokazuje, jak u\u017cywaj\u0105c mechanizmu jlink napisa\u0107 prosty skrypt uruchomieniowy dla Waszego modu\u0142u. Na koniec te\u017c szybko przechodzi przez bonusow\u0105 list\u0119 alternatywnych projekt\u00f3w, kt\u00f3re uda\u0142o mu si\u0119 odnale\u017a\u0107 podczas researchu do artyku\u0142u. \u00a0I to w\u0142a\u015bnie ta zwi\u0119z\u0142o\u015b\u0107 i przekrojowo\u015b\u0107 sprawia, \u017ce nawet, je\u015bli nie zamierzasz pisa\u0107 w najbli\u017cszym czasie desktopowych aplikacji, to jest to \u015bwietna okazja, \u017ceby od\u015bwie\u017cy\u0107 sobie nieco temat.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0e15cb4e6.gif\" alt=\"\" \/>\n\n<figcaption>Cho\u0107by na sytuacj\u0119, gdy \u015bwiat przejrzy na oczy i postanowi pozby\u0107 si\u0119 wszelkich elektronowych aberracji.<\/figcaption><\/figure>\n<h3 id=\"-r-d-a--1\">\u0179r\u00f3d\u0142a:<\/h3>\n<ul>\n \t<li><a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/1\/\" rel=\"noopener\">The state of JVM desktop frameworks<\/a><\/li>\n \t<li><a href=\"https:\/\/blog.frankel.ch\/state-jvm-desktop-frameworks\/6\/\">Distribution of JVM desktop applications<\/a><\/li>\n \t<li><a href=\"https:\/\/openjdk.java.net\/jeps\/392\">JEP 392: Packaging Tool<\/a><\/li>\n<\/ul>"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10181","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=10181"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10181\/revisions"}],"predecessor-version":[{"id":10586,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10181\/revisions\/10586"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}