{"id":10089,"date":"2021-08-31T15:14:08","date_gmt":"2021-08-31T13:14:08","guid":{"rendered":"https:\/\/vived.io\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/"},"modified":"2022-09-19T13:10:49","modified_gmt":"2022-09-19T11:10:49","slug":"jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/","title":{"rendered":"JVM Tuesday vol. 53 &#8211; Nowy Micronaut, nowy Kotlin, lepsze JavaDocs"},"content":{"rendered":"\n<h2 id=\"1-micronaut-3-0-wydany\" data-num=1>1. <a href=\"https:\/\/micronaut.io\/2021\/08\/18\/micronaut-framework-3-released\/\">Micronaut 3.0 Wydany \ud83d\udd2c<\/a><\/h2>\n\n\n\n<p>Jako \u017ce poprzedni\u0105 edycj\u0119 \u201czaw\u0142aszczy\u0142o\u201d nam podsumowanie roku, nie mieli\u015bmy okazji poinformowa\u0107 Was o wa\u017cnej premierze w \u015bwiecie javowych framework\u00f3w. Micronaut (i mo\u017ce troch\u0119 \u015bp. Dropwizard) par\u0119 lat temu zapocz\u0105tkowa\u0142 nowy rzut javowych framework\u00f3w, chc\u0105cy rzuci\u0107 r\u0119kawice dotychczas niepokonanemu Springowi. By\u0142 to moment, gdy po latach stara\u0144 Java EE zgubi\u0142a gdzie\u015b chwilowo zyskany impet (g\u0142\u00f3wnie przez fatalne wsparcie dla Microserwis\u00f3w) i w zasadzie zaczyna\u0142a coraz bardziej zjada\u0107 w\u0142asny ogon. Wtedy to tw\u00f3rca Grails\u00f3w (framework\u00f3w Rails-like przeznaczonego dla Ruby-like j\u0119zyka Groovy) zdecydowa\u0142 si\u0119 pokaza\u0107 \u015bwiatu swoje dziecko, stanowi\u0105ce alternatyw\u0119 dla Spring Boota. G\u0142\u00f3wnym wyr\u00f3\u017cnikiem Micronauta by\u0142a rezygnacja z refleksji na rzecz procesor\u00f3w anotacji i generowaniu niezb\u0119dnego kodu na poziomie kompilacji. Rozwi\u0105zanie to by\u0142o wyra\u017anie inspirowane rozwi\u0105zaniami wykorzystywanymi w programowaniu mobilnym i stanowi\u0142o powiew \u015bwie\u017co\u015bci w nieco zasta\u0142ym ekosystemie.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/giphy.gif\" alt=\"Sad New Year GIF\"\/><figcaption>To nie by\u0142y pasjonuj\u0105ce czasy<\/figcaption><\/figure><\/div>\n\n\n<p>Od tego czasu \u015bwiat zd\u0105\u017cy\u0142 si\u0119 zmieni\u0107. Pojawi\u0142a si\u0119 ca\u0142a nowa generacja framework\u00f3w, takich jak Helidon i Quarkus, a Micronaut &#8211; cho\u0107 wci\u0105\u017c popularny &#8211; nie jest ju\u017c w awangardzie JVMowego programowania. Dlatego te\u017c wiadomo\u015b\u0107 o pojawieniu si\u0119 trzeciego wydania przesz\u0142a nieco bez echa. Nie oznacza to jednak, \u017ce tw\u00f3rcy nie przygotowali niczego interesuj\u0105cego.<br><br>Jeden z \u201chighlight\u00f3w\u201d wydania to z pewno\u015bci\u0105 migracja z RxJava 2 do Project Reactor (co pewnie ma na celu u\u0142atwienie migracji u\u017cytkownikom Springa). Wersja 3.0 zmienia te\u017c spos\u00f3b dziedziczenia adnotacji. Do tej pory komponent domy\u015blnie dziedziczy\u0142 wszystkie adnotacje z interfejs\u00f3w lub klas nadrz\u0119dnych. Od nowej edycji tak b\u0119dzie si\u0119 dzia\u0142o tylko w wypadku dostarczenia dodatkowej adnotacji @Inherited.<br><br>Micronaut ostatecznie \u201cprzepisa\u0142\u201d si\u0119 te\u017c na namespace jakarty, porzucaj\u0105c stare interfejsy javax dla anotacji PreDestroy i PostConstruct. Wprowadzono r\u00f3wnie\u017c sporo zmian w obs\u0142udze GraalVM, a tak\u017ce przepisano implementacje filtr\u00f3w serwerowych, kt\u00f3re zaczn\u0105 zachowywa\u0107 si\u0119 inaczej w sytuacji wyst\u0105pienia wyj\u0105tku. W Micronaut 2.0 zdarza\u0142a si\u0119 mo\u017cliwo\u015b\u0107 ponownego wykonania filtru w niekt\u00f3rych przypadkach, Micronaut 3.0 postanowi\u0142 po\u0142o\u017cy\u0107 nacisk na sp\u00f3jno\u015b\u0107 i przewidywalno\u015b\u0107 &#8211; niezale\u017cnie od sytuacji, konkretny filtr wykona si\u0119 tylko raz.<br><br>Prywata: Sam u\u017cywa\u0142em Micronauta w jednym z projekt\u00f3w i bardzo dobrze to wspominam (poza pewnymi brakami w dokumentacji\u2026). Dlatego je\u015bli macie ochot\u0119 poeksperymentowa\u0107 &#8211; my\u015bl\u0119 \u017ce b\u0119dzie to od\u015bwie\u017caj\u0105ce do\u015bwiadczenie.<\/p>\n\n\n\n<h2 id=\"2-wydano-kotlina-1-5-30\" data-num=2>2. <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/kotlin-1-5-30-released\/\">Wydano Kotlina 1.5.30 \ud83c\udf45<\/a><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/EQf-wm_XUAEcbBq.jpg\" alt=\"Vasiliy Zukanov \u05d1\u05d8\u05d5\u05d5\u05d9\u05d8\u05e8: &quot;No more NullPointerException in @Kotlin \ud83d\udd25 (I  shamelessly stole this meme from r\/mAndroidDev)\u2026 &quot;\"\/><\/figure>\n\n\n\n<p>O Kotlinie 1.5.30 <a href=\"https:\/\/blog.vived.io\/jvm-tuesday-vol-48\/\">ju\u017c pisali\u015bmy przy okazji wersji bety tego wydania<\/a>, ale jako \u017ce nareszcie trafi\u0142o ono do szerokiej publiki, warto si\u0119 mu przygl\u0105dn\u0105\u0107 nieco bli\u017cej. Poniewa\u017c Kotlin 1.5.30 jest ostatnim \u201cminorem\u201d przed Kotlin 1.6.0, zawiera wiele funkcji j\u0119zyka eksperymentalnego i standardowych bibliotek, kt\u00f3re pojawi\u0105 si\u0119 w du\u017cym wydaniu. O \u015brodowisku uruchomieniowym (wsparcie dla M1, nowa reprezentacja po\u015brednia) pisali\u015bmy w linkowanym po\u015bcie, dzisiaj zajmiemy si\u0119 zmianami w samym j\u0119zyku.<br><br>Nowe wydanie przynosi mi\u0119dzy innymi \u2018sealed when\u2019, kt\u00f3re maj\u0105 zapewni\u0107, \u017ce ta kotlinowa alternatywa dla switchy stanie si\u0119 \u201cwyczerpuj\u0105ca\u201d &#8211; kompilator rzuci b\u0142\u0105d, je\u015bli nie obs\u0142u\u017cymy wszystkich przypadk\u00f3w.<br><br>Wprowadzona te\u017c zostaje obs\u0142uga funkcji suspend jako funkcyjnych nadtyp\u00f3w:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MyClass: suspend () -&gt; Unit {\n    override suspend fun invoke() { TODO() }\n}<\/code><\/pre>\n\n\n\n<p>Nale\u017cy tutaj wspomnie\u0107, \u017ce w przypadku tego ostatniego istniej\u0105 ograniczenia. Ze wzgl\u0119du na spos\u00f3b, w jaki korutyny zachowuj\u0105 si\u0119 na poziomie JVMa (<a href=\"https:\/\/www.slideshare.net\/ArturSkowroski\/cig-dalszy-nastpi-o-wielowtkowoci-projekcie-loom-i-kotlinowych-korutynach\">mia\u0142em okazj\u0119 kiedy\u015b zrobi\u0107 wyst\u0105pienie na ten temat<\/a>), niemo\u017cliwe jest przyk\u0142adowo miksowanie ich z funkcyjnymi typami:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>suspend (Int) -&gt; ((Int) -&gt; Unit)<\/code><\/pre>\n\n\n\n<p>Opr\u00f3cz powy\u017cszych zmian w funkcjach i sk\u0142adni j\u0119zyka (dost\u0119pnych za eksperymentaln\u0105 flag\u0105), Kotlin 1.5.30 to tak\u017ce sporo zmian pod mask\u0105. Wprowadzone zosta\u0142o m.in. wsparcie dla tak zwanych \u201crecursive generic types\u201d, czyli rekurencyjnych typach generycznych &#8211; takie, w kt\u00f3rych typ jest definiowany poprzez samego siebie. Jest to uzupe\u0142nienie Kotlina o pewne braki jego systemu typ\u00f3w w stosunku do Javy, kt\u00f3re uwidoczni\u0142y si\u0119 w sytuacjach brzegowych. Przyk\u0142adem niech b\u0119dzie interfejs <a href=\"https:\/\/github.com\/testcontainers\/testcontainers-java\/blob\/master\/modules\/postgresql\/src\/main\/java\/org\/testcontainers\/containers\/PostgreSQLContainer.java\">TestContainers<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class PostgreSQLContainer&lt;SELF extends PostgreSQLContainer&lt;SELF&gt;&gt; extends JdbcDatabaseContainer&lt;SELF&gt; {<\/code><\/pre>\n\n\n\n<p>Do tej pory Kotlin mia\u0142 problemy z inferowaniem tego rodzaju typ\u00f3w, co prowadzi\u0142o do ko\u015blawc\u00f3w j\u0119zykowych. Teraz zmieni si\u0119 to wraz z now\u0105 wersj\u0105 j\u0119zyka.<br><br>Jak wida\u0107, niekt\u00f3re z powy\u017cszych zmiany s\u0105 do\u015b\u0107 hermetyczne (Kotlin pod tym wzgl\u0119dem przypomina mi nieco TypeScripta), jednak ostatecznie sk\u0142adaj\u0105 si\u0119 one na coraz wygodniejszy i bezpieczny dla programisty j\u0119zyk. Osobi\u015bcie bardzo czekam na \u201czapiecz\u0119towane wheny\u201d, ju\u017c widz\u0119 dla nich kilka zastosowa\u0144.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"What&#039;s new in Kotlin 1.5.30\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/rNbb3A9IdOo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><figcaption>Je\u017celi lubicie video &#8211; zesp\u00f3\u0142 Kotlina udost\u0119pnia swoje Release Notes r\u00f3wnie\u017c w takiej wersji.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"3-snippety-trafiaja-do-javadocs\" data-num=3>3. Snippety trafiaj\u0105 do JavaDocs \ud83d\udcdc<\/h2>\n\n\n\n<p>A na koniec drobnica\u2026 ale dawno nie by\u0142o JEP\u00f3w. Java wprowadzi\u0142a znacznik <em>@snippet<\/em> do JavaDoc, co ma na celu upro\u015bci\u0107 do\u0142\u0105czanie przyk\u0142adowego kodu \u017ar\u00f3d\u0142owego do dokumentacji API.<br><br>Do tej pory dokumentacja nie posiada\u0142a specjalnego tagu pozwalaj\u0105cego programistom przekaza\u0107 przyk\u0142adowe u\u017cycia API. Teraz to si\u0119 zmieni. Co ciekawe, tw\u00f3rcy API zapewnili u\u017cytkownikom dwa r\u00f3\u017cne warianty. Przyk\u0142ady b\u0119dzie mo\u017cna przekaza\u0107 \u201cinline\u201d:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet :\n * if (v.isPresent()) {\n *     System.out.println(&quot;v: &quot; + v.get());\n * }\n * }\n *\/\n<\/code><\/pre>\n\n\n\n<p>Ale r\u00f3wnie\u017c jako zewn\u0119trzny plik:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet file=&quot;ShowOptional.java&quot; region=&quot;example&quot;}\n *\/\n---------------------------\npublic class ShowOptional {\n    void show(Optional&lt;String&gt; v) {\n        \/\/ @start region=&quot;example&quot;\n        if (v.isPresent()) {\n            System.out.println(&quot;v: &quot; + v.get());\n        }\n        \/\/ @end\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Pytanie do Was &#8211; czy cz\u0119sto zdarza si\u0119 Wam u\u017cywa\u0107 znacznik\u00f3w JavaDocs w swoim kodzie? Osobi\u015bcie robi\u0142emrobi\u0142e to raz, przy tworzeniu generycznej biblioteki dla ca\u0142ej firmy\u2026 i musz\u0119 przyzna\u0107, \u017ce troch\u0119 mnie to bola\u0142o ze wzgl\u0119du na pogorszenie czytelno\u015bci kodu &#8211; dlatego te\u017c ciesz\u0119 si\u0119, \u017ce tw\u00f3rcy rozwa\u017cyli mo\u017cliwo\u015b\u0107 u\u017cycia zewn\u0119trznych plik\u00f3w jako \u201csampli\u201d. Przy ca\u0142ym moim oporze przed dok\u0142adaniem JavaDoc\u00f3w samemu, z perspektywy u\u017cytkownika API szanuje bowiem jednak ka\u017cde dzia\u0142ania tego typu. Ot, ludzka natura jest pe\u0142na sprzeczno\u015bci.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a886f756e97.png\" alt=\"\"\/><figcaption>Weltschmerz.<\/figcaption><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>W dniu dzisiejszym same nowo\u015bci &#8211; nowy Micronaut, nowy Kotlin, a tak\u017ce nowy spos\u00f3b formatowania JavaDocs. Zapraszamy do lektury!<\/p>\n","protected":false},"author":10,"featured_media":7665,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-10089","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl"],"acf":{"estimated_reading_time":"5","weekly_summary":true,"feature_image_blog":false,"push_notification_image":false,"feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JVM Tuesday vol. 53 - Nowy Micronaut, nowy Kotlin, lepsze JavaDocs - 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-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Tuesday vol. 53 - Nowy Micronaut, nowy Kotlin, lepsze JavaDocs - Vived\" \/>\n<meta property=\"og:description\" content=\"W dniu dzisiejszym same nowo\u015bci - nowy Micronaut, nowy Kotlin, a tak\u017ce nowy spos\u00f3b formatowania JavaDocs. Zapraszamy do lektury!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-31T13:14:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1811\" \/>\n\t<meta property=\"og:image:height\" content=\"947\" \/>\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\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Tuesday vol. 53 &#8211; Nowy Micronaut, nowy Kotlin, lepsze JavaDocs\",\"datePublished\":\"2021-08-31T13:14:08+00:00\",\"dateModified\":\"2022-09-19T11:10:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\"},\"wordCount\":982,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\",\"name\":\"JVM Tuesday vol. 53 - Nowy Micronaut, nowy Kotlin, lepsze JavaDocs - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png\",\"datePublished\":\"2021-08-31T13:14:08+00:00\",\"dateModified\":\"2022-09-19T11:10:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png\",\"width\":1811,\"height\":947},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Tuesday vol. 53 &#8211; Nowy Micronaut, nowy Kotlin, lepsze JavaDocs\"}]},{\"@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. 53 - Nowy Micronaut, nowy Kotlin, lepsze JavaDocs - 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-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Tuesday vol. 53 - Nowy Micronaut, nowy Kotlin, lepsze JavaDocs - Vived","og_description":"W dniu dzisiejszym same nowo\u015bci - nowy Micronaut, nowy Kotlin, a tak\u017ce nowy spos\u00f3b formatowania JavaDocs. Zapraszamy do lektury!","og_url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/","og_site_name":"Vived","article_published_time":"2021-08-31T13:14:08+00:00","article_modified_time":"2022-09-19T11:10:49+00:00","og_image":[{"width":1811,"height":947,"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.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\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Tuesday vol. 53 &#8211; Nowy Micronaut, nowy Kotlin, lepsze JavaDocs","datePublished":"2021-08-31T13:14:08+00:00","dateModified":"2022-09-19T11:10:49+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/"},"wordCount":982,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png","articleSection":["JVM"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/","url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/","name":"JVM Tuesday vol. 53 - Nowy Micronaut, nowy Kotlin, lepsze JavaDocs - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png","datePublished":"2021-08-31T13:14:08+00:00","dateModified":"2022-09-19T11:10:49+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-31-at-15.17.51.png","width":1811,"height":947},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-53-nowy-micronaut-nowy-kotlin-lepsze-javadocs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Tuesday vol. 53 &#8211; Nowy Micronaut, nowy Kotlin, lepsze JavaDocs"}]},{"@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. <a href=\"https:\/\/micronaut.io\/2021\/08\/18\/micronaut-framework-3-released\/\">Micronaut 3.0 Wydany \ud83d\udd2c<\/a><\/h2>\n","innerContent":["\n<h2>1. <a href=\"https:\/\/micronaut.io\/2021\/08\/18\/micronaut-framework-3-released\/\">Micronaut 3.0 Wydany \ud83d\udd2c<\/a><\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jako \u017ce poprzedni\u0105 edycj\u0119 \u201czaw\u0142aszczy\u0142o\u201d nam podsumowanie roku, nie mieli\u015bmy okazji poinformowa\u0107 Was o wa\u017cnej premierze w \u015bwiecie javowych framework\u00f3w. Micronaut (i mo\u017ce troch\u0119 \u015bp. Dropwizard) par\u0119 lat temu zapocz\u0105tkowa\u0142 nowy rzut javowych framework\u00f3w, chc\u0105cy rzuci\u0107 r\u0119kawice dotychczas niepokonanemu Springowi. By\u0142 to moment, gdy po latach stara\u0144 Java EE zgubi\u0142a gdzie\u015b chwilowo zyskany impet (g\u0142\u00f3wnie przez fatalne wsparcie dla Microserwis\u00f3w) i w zasadzie zaczyna\u0142a coraz bardziej zjada\u0107 w\u0142asny ogon. Wtedy to tw\u00f3rca Grails\u00f3w (framework\u00f3w Rails-like przeznaczonego dla Ruby-like j\u0119zyka Groovy) zdecydowa\u0142 si\u0119 pokaza\u0107 \u015bwiatu swoje dziecko, stanowi\u0105ce alternatyw\u0119 dla Spring Boota. G\u0142\u00f3wnym wyr\u00f3\u017cnikiem Micronauta by\u0142a rezygnacja z refleksji na rzecz procesor\u00f3w anotacji i generowaniu niezb\u0119dnego kodu na poziomie kompilacji. Rozwi\u0105zanie to by\u0142o wyra\u017anie inspirowane rozwi\u0105zaniami wykorzystywanymi w programowaniu mobilnym i stanowi\u0142o powiew \u015bwie\u017co\u015bci w nieco zasta\u0142ym ekosystemie.<\/p>\n","innerContent":["\n<p>Jako \u017ce poprzedni\u0105 edycj\u0119 \u201czaw\u0142aszczy\u0142o\u201d nam podsumowanie roku, nie mieli\u015bmy okazji poinformowa\u0107 Was o wa\u017cnej premierze w \u015bwiecie javowych framework\u00f3w. Micronaut (i mo\u017ce troch\u0119 \u015bp. Dropwizard) par\u0119 lat temu zapocz\u0105tkowa\u0142 nowy rzut javowych framework\u00f3w, chc\u0105cy rzuci\u0107 r\u0119kawice dotychczas niepokonanemu Springowi. By\u0142 to moment, gdy po latach stara\u0144 Java EE zgubi\u0142a gdzie\u015b chwilowo zyskany impet (g\u0142\u00f3wnie przez fatalne wsparcie dla Microserwis\u00f3w) i w zasadzie zaczyna\u0142a coraz bardziej zjada\u0107 w\u0142asny ogon. Wtedy to tw\u00f3rca Grails\u00f3w (framework\u00f3w Rails-like przeznaczonego dla Ruby-like j\u0119zyka Groovy) zdecydowa\u0142 si\u0119 pokaza\u0107 \u015bwiatu swoje dziecko, stanowi\u0105ce alternatyw\u0119 dla Spring Boota. G\u0142\u00f3wnym wyr\u00f3\u017cnikiem Micronauta by\u0142a rezygnacja z refleksji na rzecz procesor\u00f3w anotacji i generowaniu niezb\u0119dnego kodu na poziomie kompilacji. Rozwi\u0105zanie to by\u0142o wyra\u017anie inspirowane rozwi\u0105zaniami wykorzystywanymi w programowaniu mobilnym i stanowi\u0142o powiew \u015bwie\u017co\u015bci w nieco zasta\u0142ym ekosystemie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/giphy.gif\" alt=\"Sad New Year GIF\"\/><figcaption>To nie by\u0142y pasjonuj\u0105ce czasy<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/giphy.gif\" alt=\"Sad New Year GIF\"\/><figcaption>To nie by\u0142y pasjonuj\u0105ce czasy<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od tego czasu \u015bwiat zd\u0105\u017cy\u0142 si\u0119 zmieni\u0107. Pojawi\u0142a si\u0119 ca\u0142a nowa generacja framework\u00f3w, takich jak Helidon i Quarkus, a Micronaut - cho\u0107 wci\u0105\u017c popularny - nie jest ju\u017c w awangardzie JVMowego programowania. Dlatego te\u017c wiadomo\u015b\u0107 o pojawieniu si\u0119 trzeciego wydania przesz\u0142a nieco bez echa. Nie oznacza to jednak, \u017ce tw\u00f3rcy nie przygotowali niczego interesuj\u0105cego.<br><br>Jeden z \u201chighlight\u00f3w\u201d wydania to z pewno\u015bci\u0105 migracja z RxJava 2 do Project Reactor (co pewnie ma na celu u\u0142atwienie migracji u\u017cytkownikom Springa). Wersja 3.0 zmienia te\u017c spos\u00f3b dziedziczenia adnotacji. Do tej pory komponent domy\u015blnie dziedziczy\u0142 wszystkie adnotacje z interfejs\u00f3w lub klas nadrz\u0119dnych. Od nowej edycji tak b\u0119dzie si\u0119 dzia\u0142o tylko w wypadku dostarczenia dodatkowej adnotacji @Inherited.<br><br>Micronaut ostatecznie \u201cprzepisa\u0142\u201d si\u0119 te\u017c na namespace jakarty, porzucaj\u0105c stare interfejsy javax dla anotacji PreDestroy i PostConstruct. Wprowadzono r\u00f3wnie\u017c sporo zmian w obs\u0142udze GraalVM, a tak\u017ce przepisano implementacje filtr\u00f3w serwerowych, kt\u00f3re zaczn\u0105 zachowywa\u0107 si\u0119 inaczej w sytuacji wyst\u0105pienia wyj\u0105tku. W Micronaut 2.0 zdarza\u0142a si\u0119 mo\u017cliwo\u015b\u0107 ponownego wykonania filtru w niekt\u00f3rych przypadkach, Micronaut 3.0 postanowi\u0142 po\u0142o\u017cy\u0107 nacisk na sp\u00f3jno\u015b\u0107 i przewidywalno\u015b\u0107 - niezale\u017cnie od sytuacji, konkretny filtr wykona si\u0119 tylko raz.<br><br>Prywata: Sam u\u017cywa\u0142em Micronauta w jednym z projekt\u00f3w i bardzo dobrze to wspominam (poza pewnymi brakami w dokumentacji\u2026). Dlatego je\u015bli macie ochot\u0119 poeksperymentowa\u0107 - my\u015bl\u0119 \u017ce b\u0119dzie to od\u015bwie\u017caj\u0105ce do\u015bwiadczenie.<\/p>\n","innerContent":["\n<p>Od tego czasu \u015bwiat zd\u0105\u017cy\u0142 si\u0119 zmieni\u0107. Pojawi\u0142a si\u0119 ca\u0142a nowa generacja framework\u00f3w, takich jak Helidon i Quarkus, a Micronaut - cho\u0107 wci\u0105\u017c popularny - nie jest ju\u017c w awangardzie JVMowego programowania. Dlatego te\u017c wiadomo\u015b\u0107 o pojawieniu si\u0119 trzeciego wydania przesz\u0142a nieco bez echa. Nie oznacza to jednak, \u017ce tw\u00f3rcy nie przygotowali niczego interesuj\u0105cego.<br><br>Jeden z \u201chighlight\u00f3w\u201d wydania to z pewno\u015bci\u0105 migracja z RxJava 2 do Project Reactor (co pewnie ma na celu u\u0142atwienie migracji u\u017cytkownikom Springa). Wersja 3.0 zmienia te\u017c spos\u00f3b dziedziczenia adnotacji. Do tej pory komponent domy\u015blnie dziedziczy\u0142 wszystkie adnotacje z interfejs\u00f3w lub klas nadrz\u0119dnych. Od nowej edycji tak b\u0119dzie si\u0119 dzia\u0142o tylko w wypadku dostarczenia dodatkowej adnotacji @Inherited.<br><br>Micronaut ostatecznie \u201cprzepisa\u0142\u201d si\u0119 te\u017c na namespace jakarty, porzucaj\u0105c stare interfejsy javax dla anotacji PreDestroy i PostConstruct. Wprowadzono r\u00f3wnie\u017c sporo zmian w obs\u0142udze GraalVM, a tak\u017ce przepisano implementacje filtr\u00f3w serwerowych, kt\u00f3re zaczn\u0105 zachowywa\u0107 si\u0119 inaczej w sytuacji wyst\u0105pienia wyj\u0105tku. W Micronaut 2.0 zdarza\u0142a si\u0119 mo\u017cliwo\u015b\u0107 ponownego wykonania filtru w niekt\u00f3rych przypadkach, Micronaut 3.0 postanowi\u0142 po\u0142o\u017cy\u0107 nacisk na sp\u00f3jno\u015b\u0107 i przewidywalno\u015b\u0107 - niezale\u017cnie od sytuacji, konkretny filtr wykona si\u0119 tylko raz.<br><br>Prywata: Sam u\u017cywa\u0142em Micronauta w jednym z projekt\u00f3w i bardzo dobrze to wspominam (poza pewnymi brakami w dokumentacji\u2026). Dlatego je\u015bli macie ochot\u0119 poeksperymentowa\u0107 - my\u015bl\u0119 \u017ce b\u0119dzie to od\u015bwie\u017caj\u0105ce do\u015bwiadczenie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/kotlin-1-5-30-released\/\">Wydano Kotlina 1.5.30 \ud83c\udf45<\/a><\/h2>\n","innerContent":["\n<h2>2. <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/kotlin-1-5-30-released\/\">Wydano Kotlina 1.5.30 \ud83c\udf45<\/a><\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":[],"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/EQf-wm_XUAEcbBq.jpg\" alt=\"Vasiliy Zukanov \u05d1\u05d8\u05d5\u05d5\u05d9\u05d8\u05e8: &quot;No more NullPointerException in @Kotlin \ud83d\udd25 (I  shamelessly stole this meme from r\/mAndroidDev)\u2026 &quot;\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/EQf-wm_XUAEcbBq.jpg\" alt=\"Vasiliy Zukanov \u05d1\u05d8\u05d5\u05d5\u05d9\u05d8\u05e8: &quot;No more NullPointerException in @Kotlin \ud83d\udd25 (I  shamelessly stole this meme from r\/mAndroidDev)\u2026 &quot;\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>O Kotlinie 1.5.30 <a href=\"https:\/\/blog.vived.io\/jvm-tuesday-vol-48\/\">ju\u017c pisali\u015bmy przy okazji wersji bety tego wydania<\/a>, ale jako \u017ce nareszcie trafi\u0142o ono do szerokiej publiki, warto si\u0119 mu przygl\u0105dn\u0105\u0107 nieco bli\u017cej. Poniewa\u017c Kotlin 1.5.30 jest ostatnim \u201cminorem\u201d przed Kotlin 1.6.0, zawiera wiele funkcji j\u0119zyka eksperymentalnego i standardowych bibliotek, kt\u00f3re pojawi\u0105 si\u0119 w du\u017cym wydaniu. O \u015brodowisku uruchomieniowym (wsparcie dla M1, nowa reprezentacja po\u015brednia) pisali\u015bmy w linkowanym po\u015bcie, dzisiaj zajmiemy si\u0119 zmianami w samym j\u0119zyku.<br><br>Nowe wydanie przynosi mi\u0119dzy innymi \u2018sealed when\u2019, kt\u00f3re maj\u0105 zapewni\u0107, \u017ce ta kotlinowa alternatywa dla switchy stanie si\u0119 \u201cwyczerpuj\u0105ca\u201d - kompilator rzuci b\u0142\u0105d, je\u015bli nie obs\u0142u\u017cymy wszystkich przypadk\u00f3w.<br><br>Wprowadzona te\u017c zostaje obs\u0142uga funkcji suspend jako funkcyjnych nadtyp\u00f3w:<\/p>\n","innerContent":["\n<p>O Kotlinie 1.5.30 <a href=\"https:\/\/blog.vived.io\/jvm-tuesday-vol-48\/\">ju\u017c pisali\u015bmy przy okazji wersji bety tego wydania<\/a>, ale jako \u017ce nareszcie trafi\u0142o ono do szerokiej publiki, warto si\u0119 mu przygl\u0105dn\u0105\u0107 nieco bli\u017cej. Poniewa\u017c Kotlin 1.5.30 jest ostatnim \u201cminorem\u201d przed Kotlin 1.6.0, zawiera wiele funkcji j\u0119zyka eksperymentalnego i standardowych bibliotek, kt\u00f3re pojawi\u0105 si\u0119 w du\u017cym wydaniu. O \u015brodowisku uruchomieniowym (wsparcie dla M1, nowa reprezentacja po\u015brednia) pisali\u015bmy w linkowanym po\u015bcie, dzisiaj zajmiemy si\u0119 zmianami w samym j\u0119zyku.<br><br>Nowe wydanie przynosi mi\u0119dzy innymi \u2018sealed when\u2019, kt\u00f3re maj\u0105 zapewni\u0107, \u017ce ta kotlinowa alternatywa dla switchy stanie si\u0119 \u201cwyczerpuj\u0105ca\u201d - kompilator rzuci b\u0142\u0105d, je\u015bli nie obs\u0142u\u017cymy wszystkich przypadk\u00f3w.<br><br>Wprowadzona te\u017c zostaje obs\u0142uga funkcji suspend jako funkcyjnych nadtyp\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>class MyClass: suspend () -&gt; Unit {\n    override suspend fun invoke() { TODO() }\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class MyClass: suspend () -&gt; Unit {\n    override suspend fun invoke() { TODO() }\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nale\u017cy tutaj wspomnie\u0107, \u017ce w przypadku tego ostatniego istniej\u0105 ograniczenia. Ze wzgl\u0119du na spos\u00f3b, w jaki korutyny zachowuj\u0105 si\u0119 na poziomie JVMa (<a href=\"https:\/\/www.slideshare.net\/ArturSkowroski\/cig-dalszy-nastpi-o-wielowtkowoci-projekcie-loom-i-kotlinowych-korutynach\">mia\u0142em okazj\u0119 kiedy\u015b zrobi\u0107 wyst\u0105pienie na ten temat<\/a>), niemo\u017cliwe jest przyk\u0142adowo miksowanie ich z funkcyjnymi typami:&nbsp;<\/p>\n","innerContent":["\n<p>Nale\u017cy tutaj wspomnie\u0107, \u017ce w przypadku tego ostatniego istniej\u0105 ograniczenia. Ze wzgl\u0119du na spos\u00f3b, w jaki korutyny zachowuj\u0105 si\u0119 na poziomie JVMa (<a href=\"https:\/\/www.slideshare.net\/ArturSkowroski\/cig-dalszy-nastpi-o-wielowtkowoci-projekcie-loom-i-kotlinowych-korutynach\">mia\u0142em okazj\u0119 kiedy\u015b zrobi\u0107 wyst\u0105pienie na ten temat<\/a>), niemo\u017cliwe jest przyk\u0142adowo miksowanie ich z funkcyjnymi typami:&nbsp;<\/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>suspend (Int) -&gt; ((Int) -&gt; Unit)<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>suspend (Int) -&gt; ((Int) -&gt; Unit)<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz powy\u017cszych zmian w funkcjach i sk\u0142adni j\u0119zyka (dost\u0119pnych za eksperymentaln\u0105 flag\u0105), Kotlin 1.5.30 to tak\u017ce sporo zmian pod mask\u0105. Wprowadzone zosta\u0142o m.in. wsparcie dla tak zwanych \u201crecursive generic types\u201d, czyli rekurencyjnych typach generycznych - takie, w kt\u00f3rych typ jest definiowany poprzez samego siebie. Jest to uzupe\u0142nienie Kotlina o pewne braki jego systemu typ\u00f3w w stosunku do Javy, kt\u00f3re uwidoczni\u0142y si\u0119 w sytuacjach brzegowych. Przyk\u0142adem niech b\u0119dzie interfejs <a href=\"https:\/\/github.com\/testcontainers\/testcontainers-java\/blob\/master\/modules\/postgresql\/src\/main\/java\/org\/testcontainers\/containers\/PostgreSQLContainer.java\">TestContainers<\/a>:<\/p>\n","innerContent":["\n<p>Opr\u00f3cz powy\u017cszych zmian w funkcjach i sk\u0142adni j\u0119zyka (dost\u0119pnych za eksperymentaln\u0105 flag\u0105), Kotlin 1.5.30 to tak\u017ce sporo zmian pod mask\u0105. Wprowadzone zosta\u0142o m.in. wsparcie dla tak zwanych \u201crecursive generic types\u201d, czyli rekurencyjnych typach generycznych - takie, w kt\u00f3rych typ jest definiowany poprzez samego siebie. Jest to uzupe\u0142nienie Kotlina o pewne braki jego systemu typ\u00f3w w stosunku do Javy, kt\u00f3re uwidoczni\u0142y si\u0119 w sytuacjach brzegowych. Przyk\u0142adem niech b\u0119dzie interfejs <a href=\"https:\/\/github.com\/testcontainers\/testcontainers-java\/blob\/master\/modules\/postgresql\/src\/main\/java\/org\/testcontainers\/containers\/PostgreSQLContainer.java\">TestContainers<\/a>:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>public class PostgreSQLContainer&lt;SELF extends PostgreSQLContainer&lt;SELF&gt;&gt; extends JdbcDatabaseContainer&lt;SELF&gt; {<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>public class PostgreSQLContainer&lt;SELF extends PostgreSQLContainer&lt;SELF&gt;&gt; extends JdbcDatabaseContainer&lt;SELF&gt; {<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Do tej pory Kotlin mia\u0142 problemy z inferowaniem tego rodzaju typ\u00f3w, co prowadzi\u0142o do ko\u015blawc\u00f3w j\u0119zykowych. Teraz zmieni si\u0119 to wraz z now\u0105 wersj\u0105 j\u0119zyka.<br><br>Jak wida\u0107, niekt\u00f3re z powy\u017cszych zmiany s\u0105 do\u015b\u0107 hermetyczne (Kotlin pod tym wzgl\u0119dem przypomina mi nieco TypeScripta), jednak ostatecznie sk\u0142adaj\u0105 si\u0119 one na coraz wygodniejszy i bezpieczny dla programisty j\u0119zyk. Osobi\u015bcie bardzo czekam na \u201czapiecz\u0119towane wheny\u201d, ju\u017c widz\u0119 dla nich kilka zastosowa\u0144.<\/p>\n","innerContent":["\n<p>Do tej pory Kotlin mia\u0142 problemy z inferowaniem tego rodzaju typ\u00f3w, co prowadzi\u0142o do ko\u015blawc\u00f3w j\u0119zykowych. Teraz zmieni si\u0119 to wraz z now\u0105 wersj\u0105 j\u0119zyka.<br><br>Jak wida\u0107, niekt\u00f3re z powy\u017cszych zmiany s\u0105 do\u015b\u0107 hermetyczne (Kotlin pod tym wzgl\u0119dem przypomina mi nieco TypeScripta), jednak ostatecznie sk\u0142adaj\u0105 si\u0119 one na coraz wygodniejszy i bezpieczny dla programisty j\u0119zyk. Osobi\u015bcie bardzo czekam na \u201czapiecz\u0119towane wheny\u201d, ju\u017c widz\u0119 dla nich kilka zastosowa\u0144.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=rNbb3A9IdOo","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=rNbb3A9IdOo\n<\/div><figcaption>Je\u017celi lubicie video - zesp\u00f3\u0142 Kotlina udost\u0119pnia swoje Release Notes r\u00f3wnie\u017c w takiej wersji.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=rNbb3A9IdOo\n<\/div><figcaption>Je\u017celi lubicie video - zesp\u00f3\u0142 Kotlina udost\u0119pnia swoje Release Notes r\u00f3wnie\u017c w takiej wersji.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Snippety trafiaj\u0105 do JavaDocs \ud83d\udcdc<\/h2>\n","innerContent":["\n<h2>3. Snippety trafiaj\u0105 do JavaDocs \ud83d\udcdc<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec drobnica\u2026 ale dawno nie by\u0142o JEP\u00f3w. Java wprowadzi\u0142a znacznik <em>@snippet<\/em> do JavaDoc, co ma na celu upro\u015bci\u0107 do\u0142\u0105czanie przyk\u0142adowego kodu \u017ar\u00f3d\u0142owego do dokumentacji API.<br><br>Do tej pory dokumentacja nie posiada\u0142a specjalnego tagu pozwalaj\u0105cego programistom przekaza\u0107 przyk\u0142adowe u\u017cycia API. Teraz to si\u0119 zmieni. Co ciekawe, tw\u00f3rcy API zapewnili u\u017cytkownikom dwa r\u00f3\u017cne warianty. Przyk\u0142ady b\u0119dzie mo\u017cna przekaza\u0107 \u201cinline\u201d:<\/p>\n","innerContent":["\n<p>A na koniec drobnica\u2026 ale dawno nie by\u0142o JEP\u00f3w. Java wprowadzi\u0142a znacznik <em>@snippet<\/em> do JavaDoc, co ma na celu upro\u015bci\u0107 do\u0142\u0105czanie przyk\u0142adowego kodu \u017ar\u00f3d\u0142owego do dokumentacji API.<br><br>Do tej pory dokumentacja nie posiada\u0142a specjalnego tagu pozwalaj\u0105cego programistom przekaza\u0107 przyk\u0142adowe u\u017cycia API. Teraz to si\u0119 zmieni. Co ciekawe, tw\u00f3rcy API zapewnili u\u017cytkownikom dwa r\u00f3\u017cne warianty. Przyk\u0142ady b\u0119dzie mo\u017cna przekaza\u0107 \u201cinline\u201d:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet :\n * if (v.isPresent()) {\n *     System.out.println(\"v: \" + v.get());\n * }\n * }\n *\/\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet :\n * if (v.isPresent()) {\n *     System.out.println(\"v: \" + v.get());\n * }\n * }\n *\/\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ale r\u00f3wnie\u017c jako zewn\u0119trzny plik:<\/p>\n","innerContent":["\n<p>Ale r\u00f3wnie\u017c jako zewn\u0119trzny plik:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet file=\"ShowOptional.java\" region=\"example\"}\n *\/\n---------------------------\npublic class ShowOptional {\n    void show(Optional&lt;String&gt; v) {\n        \/\/ @start region=\"example\"\n        if (v.isPresent()) {\n            System.out.println(\"v: \" + v.get());\n        }\n        \/\/ @end\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet file=\"ShowOptional.java\" region=\"example\"}\n *\/\n---------------------------\npublic class ShowOptional {\n    void show(Optional&lt;String&gt; v) {\n        \/\/ @start region=\"example\"\n        if (v.isPresent()) {\n            System.out.println(\"v: \" + v.get());\n        }\n        \/\/ @end\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pytanie do Was - czy cz\u0119sto zdarza si\u0119 Wam u\u017cywa\u0107 znacznik\u00f3w JavaDocs w swoim kodzie? Osobi\u015bcie robi\u0142emrobi\u0142e to raz, przy tworzeniu generycznej biblioteki dla ca\u0142ej firmy\u2026 i musz\u0119 przyzna\u0107, \u017ce troch\u0119 mnie to bola\u0142o ze wzgl\u0119du na pogorszenie czytelno\u015bci kodu - dlatego te\u017c ciesz\u0119 si\u0119, \u017ce tw\u00f3rcy rozwa\u017cyli mo\u017cliwo\u015b\u0107 u\u017cycia zewn\u0119trznych plik\u00f3w jako \u201csampli\u201d. Przy ca\u0142ym moim oporze przed dok\u0142adaniem JavaDoc\u00f3w samemu, z perspektywy u\u017cytkownika API szanuje bowiem jednak ka\u017cde dzia\u0142ania tego typu. Ot, ludzka natura jest pe\u0142na sprzeczno\u015bci.&nbsp;<\/p>\n","innerContent":["\n<p>Pytanie do Was - czy cz\u0119sto zdarza si\u0119 Wam u\u017cywa\u0107 znacznik\u00f3w JavaDocs w swoim kodzie? Osobi\u015bcie robi\u0142emrobi\u0142e to raz, przy tworzeniu generycznej biblioteki dla ca\u0142ej firmy\u2026 i musz\u0119 przyzna\u0107, \u017ce troch\u0119 mnie to bola\u0142o ze wzgl\u0119du na pogorszenie czytelno\u015bci kodu - dlatego te\u017c ciesz\u0119 si\u0119, \u017ce tw\u00f3rcy rozwa\u017cyli mo\u017cliwo\u015b\u0107 u\u017cycia zewn\u0119trznych plik\u00f3w jako \u201csampli\u201d. Przy ca\u0142ym moim oporze przed dok\u0142adaniem JavaDoc\u00f3w samemu, z perspektywy u\u017cytkownika API szanuje bowiem jednak ka\u017cde dzia\u0142ania tego typu. Ot, ludzka natura jest pe\u0142na sprzeczno\u015bci.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a886f756e97.png\" alt=\"\"\/><figcaption>Weltschmerz.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a886f756e97.png\" alt=\"\"\/><figcaption>Weltschmerz.<\/figcaption><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10089","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=10089"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10089\/revisions"}],"predecessor-version":[{"id":10558,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10089\/revisions\/10558"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/7665"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}