{"id":15644,"date":"2023-04-06T14:38:36","date_gmt":"2023-04-06T12:38:36","guid":{"rendered":"https:\/\/vived.io\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/"},"modified":"2023-04-07T11:10:06","modified_gmt":"2023-04-07T09:10:06","slug":"dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/","title":{"rendered":"Dropwizard returns with parallel 3.0 and 4.0 release &#8211; JVM Weekly vol. 130"},"content":{"rendered":"\n<h2 id=\"1-jep-401-implicitly-value-object-creation-preview\" data-num=1>1. JEP 401: Implicitly Value Object Creation (Preview)<\/h2>\n\n\n\n<p>Project Valhalla strikes again and materializes another set of changes in the form of <a href=\"https:\/\/openjdk.org\/jeps\/402\">JEP 401: Implicitly Value Object Creation (Preview)<\/a> This is interesting, since the whole proposal was until recently called <strong>Null-Restricted Value Object Storage<\/strong> and even before that <strong>Primitive Classes<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"709\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-15609\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png 750w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8-300x284.png 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><figcaption class=\"wp-element-caption\">You can&#8217;t get bored with Valhalla.<\/figcaption><\/figure><\/div>\n\n\n<p>However, getting to the point, this JEP aims to improve the performance of storing Value classes &#8211; ones designed to have a similar performance profile to primitive types, but with additional benefits (such as the ability to create abstractions and encapsulation) provided by fact, they are classes. This is quite an oversimplification, but Valhalla probably was the basis for several PhDs, so it&#8217;s better this way.\n\n\n\n<\/p>\n\n\n\n<p>Value classes are designed to be faster and use less memory than regular classes. However, they are limited in use because they do not allow null values and are not atomic, meaning they cannot be modified by multiple threads simultaneously.<\/p>\n\n\n\n<p>To address these limitations, JEP introduces two new features: optional constructors and null-restricted types, the introduction of which was discussed at one time on mailing lists. Optional constructors allow programmers to create instances of value classes in a different way than is the case with other classes &#8211; it is possible, for example, to omit the constructor. On the other hand, null-restricted types allow programmers to declare that a variable or a value returned by a method cannot have a null value and automatically initialize variables with a default instance of the class when they are created (that&#8217;s why optional constructors are needed).<\/p>\n\n\n\n<p>It also provides additional syntax. To show it, I&#8217;ll show an excerpt from the original JEP. If you are curious to see what the additional null handling syntax will look like, we are talking about such:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Foo&lt;T&gt; {\n    T* get(); \/\/ Foo&lt;char&gt; returns char\n    T! getNonNull(); \/\/ Foo&lt;char&gt; returns char\n    T? getOrNull(); \/\/ Foo&lt;char&gt; returns Character?\n    T getOrAlternate(Supplier&lt;T&gt; alt); Foo&lt;char&gt; returns Character\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-15613\" width=\"491\" height=\"370\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png 982w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9-300x226.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9-768x579.png 768w\" sizes=\"auto, (max-width: 491px) 100vw, 491px\" \/><figcaption class=\"wp-element-caption\">I sense Kotlin, despite the fact that JDK creators quite often shy away from this inspiration<\/figcaption><\/figure><\/div>\n\n\n<p>Of course, a lot more is probably happening beneath the surface, as we&#8217;re only talking about the Draft here, so things can change. To emphasize how early a version we are dealing with &#8211; JEP 401 links to <a href=\"https:\/\/openjdk.org\/jeps\/8303099\">Nullness Marker JEP<\/a> which&#8230;. does not yet exist. At the time of writing, the link returns a 404 response.<\/p>\n\n\n\n<h2 id=\"2-jep-443-unnamed-patterns-and-variables\" data-num=2>2. JEP 443: Unnamed Patterns and Variables<\/h2>\n\n\n\n<p>After a rather complicated, very early-stage JEP on Valhalla, we will look at the somewhat simpler <a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443: Unnamed Patterns and Variables (Preview)<\/a>, which recently reached candidate status.<\/p>\n\n\n\n<p>Let&#8217;s start with unnamed patterns. Consider the following code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>record Point(int x, int y) {}\nrecord ColoredPoint(Point point, String color) {}\n<\/code><\/pre>\n\n\n\n<p>Let&#8217;s assume that we want to extract the x-coordinate of an instance of ColoredPoint, but we don&#8217;t care about its color. We can do this using an unnamed pattern:\n\n\n\n<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ColoredPoint coloredPoint = new ColoredPoint(new Point(3, 4), &quot;red&quot;);\n\nif (coloredPoint instanceof ColoredPoint(Point(int x, _), _)) {\n    System.out.println(&quot;x-coordinate is &quot; + x);\n}<\/code><\/pre>\n\n\n\n<p>In this example, the &#8222;Unnamed Pattern&#8221; is represented by the underscore symbol <code>_<\/code> in the <code>color<\/code> parameter position of the pattern. This allows us to extract the <code>x<\/code> coordinate of the <code>Point<\/code> component without having to specify the name or type of the <code>color<\/code> field.<\/p>\n\n\n\n<p>We already know what Unnamed Patterns are, let&#8217;s move on to what Unnamed Variables refer to.<\/p>\n\n\n\n<p>Consider the following code, which enqueus data from a queue and creates instances of <code>Point2D<\/code> from a list of coordinates in 3D space.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    int x = queue.remove();\n    int y = queue.remove();\n    int z = queue.remove();\n    points.add(new Point2D(x, y));\n}\n<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"698\" height=\"742\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-15635\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png 698w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12-282x300.png 282w\" sizes=\"auto, (max-width: 698px) 100vw, 698px\" \/><figcaption class=\"wp-element-caption\">If the above seems strange to you, you just proved to me that you don&#8217;t take part in <a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a>.<\/figcaption><\/figure><\/div>\n\n\n<p>As you can see, in each pass of the loop we drop the value of <code>z<\/code>. In this case, we can declare this variable as unnamed using the <code>_<\/code> symbol (a bit like in Scala):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    var x = queue.remove();\n    int y = queue.remove();\n    var _ = queue.remove();\n    points.add(new Point2D(x, y));\n}<\/code><\/pre>\n\n\n\n<p>This allows us to focus on the variable <code>x<\/code> and <code>y<\/code>, which are the only ones that are valid in this context. The <code>_<\/code> symbol is used as a placeholder for an unused variable and cannot be used anywhere else in the code because it has no name.<\/p>\n\n\n\n<p>Honestly, the above example doesn&#8217;t convince me either, but the authors claim that unnamed variables can be useful in situations where variable names are irrelevant or when variables are not used and can improve code readability and maintainability. Additionally, unnamed variables can help reduce false alarms generated by static analysis tools that draw attention to unused variables. Personally, I see the biggest potential for unnamed variables in the case of exception parameters, although the following example also seems to be a code smell:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>try {\n    ...\n} catch (NumberFormatException _) { \n    System.out.println(&quot;Bad number&quot;);\n}<\/code><\/pre>\n\n\n\n<h2 id=\"3-release-radar-dropwizard-3-0-i-4-0\" data-num=3>3. Release Radar: Dropwizard 3.0 i 4.0<\/h2>\n\n\n\n<p>I remember the days when I used Dropwizard, when this promising framework was at the height of its popularity. I thought it was the future of web application development and would remain in the minds of developers for a long time. Unfortunately, life and the market turned out differently. Despite the initial enthusiasm, Dropwizard started to lose its importance, and other tools and technologies overshadowed its glory. Today, as we observe the simultaneous release of versions 3.0 and 4.0, this event goes unnoticed in the world of technology, which only shows how much the perception of this once promising project has changed.\n\n\n\n<\/p>\n\n\n\n<p>What really catches your attention is the joint release of versions 3 and 4, which can be a bit confusing. The reason for the two versions is simple: Dropwizard 3.0.0 is based on Java EE and the <code>javax.<\/code> namespace, so migrating from Dropwizard 2.x to version 3.0.0 should be minimal for many projects. Dropwizard 4.0.0, on the other hand, relies on Jakarta EE dependencies and the <code>jakarta.<\/code> namespace, which may involve more work to migrate from Dropwizard 2.x to version 4.0.0 due to more package changes and more significant dependency changes.<\/p>\n\n\n\n<p>The two versions also share some common changes &#8211; raising the required Java version to 11, introducing a package structure based on JPMS (I have a feeling it&#8217;s one of the first tools taking this standard seriously), updating Jetty to 10.0.x (which also requires a minimum of Java 11), updating Apache HttpClient to 5.x, and removing support for JUnit 4.x (moved to <code>dropwizard-testing-junit4<\/code>). In addition, Dropwizard 4.0 will get support for Hibernate 6.0, requiring a move to <code>jakarta.<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png\" alt=\"\" class=\"wp-image-15617\" width=\"512\" height=\"330\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-300x193.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-768x495.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10.png 1332w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption class=\"wp-element-caption\">I know that it is not so complicated, but still, some diagrams would be useful.<\/figcaption><\/figure><\/div>\n\n\n<p>The community&#8217;s reaction to Dropwizard 3.0 and 4.0 is quite mixed. Some programmers welcome the new releases with perhaps not excitement, but at least some nostalgia (I myself belong to this group). Ardent fans of Dropwizard talk about its &#8222;virtually bug-free&#8221; nature and use of proven dependencies. It&#8217;s like an old, cozy sweater that you don&#8217;t feel the need to throw away. They also appreciate that Dropwizard is not a control freak, unlike some other frameworks (ahem, Spring Boot), allowing programmers to mix and match components as they please.<\/p>\n\n\n\n<p>However, there are also those who believe that Dropwizard is starting to show its age. They argue that more elegant and shiny frameworks have entered the scene, such as Micronaut, Quarkus, and Helidon, which offer modern features such as reactive programming, better performance, and being cloud-native. I don&#8217;t think the new version (or rather versions) will be able to change this situation much.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"280\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/yeah-i-member-memberberries.gif\" alt=\"\" class=\"wp-image-15622\"\/><figcaption class=\"wp-element-caption\">Does anyone else remember Dropwizard?<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"4-release-radar-hibernate-6-20\" data-num=4>4. Release Radar: Hibernate 6.20<\/h2>\n\n\n\n<p>And finally, the new Hibernate ORM 6.2.<\/p>\n\n\n\n<p>The release introduces better support for structured SQL types such as Struct, XML, and JSON, allowing users to work with more complex data structures. Related to this feature is the ability to user Records, which enables Hibernate to deserialize the aforementioned structural types in both directions.<\/p>\n\n\n\n<p>The release also unifies the annotations used to generate values. What&#8217;s more, Hibernate now offers full support for database partitions using the <code>@PartitionKey<\/code> annotation, which simplifies the partition column mapping process.<\/p>\n\n\n\n<p>The last noteworthy feature of Hibernate ORM 6.2.0 is the implementation of SQL MERGE. This mechanism works in a similar way to UPSERT, but it is much more powerful as it allows not only updating but also deleting records, as well as providing additional conditions for the query, such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;\nON CONFLICT (country) DO NOTHING;<\/code><\/pre>\n\n\n\n<p>Although Hibernate uses it in a way that is invisible to the end user, this novelty has allowed me to expand my knowledge of SQL a bit, so I&#8217;m sharing it.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-15625\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png 675w, https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11-300x222.png 300w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><figcaption class=\"wp-element-caption\">I have a feeling that with SQL it&#8217;s like with Excel &#8211; everyone criticizes it while using only 10% of its capabilities.<\/figcaption><\/figure><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>A, and there was also Kotlin 1.8.20, but since KotlinConf is coming up next week, we will cover this topic in the next edition, probably heavily focused on that particular language.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I wasn&#8217;t here a week ago (I had a speech at JUG and time-wise I didn&#8217;t make it anymore), but that doesn&#8217;t mean that somehow a lot has happened during my absence. Nevertheless, I have two JEPs for you today, as well as some exceptionally interesting new releases.<\/p>\n","protected":false},"author":10,"featured_media":15646,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-15644","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"7","feature_image_blog":{"ID":15649,"id":15649,"title":"ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35","filename":"ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","filesize":1960240,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","link":"https:\/\/vived.io\/pl\/dropwizard-wraca-z-rownoleglym-wydaniem-3-0-i-4-0-jvm-weekly-vol-130\/arturskowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-2\/","alt":"","author":"10","description":"","caption":"","name":"arturskowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-2","status":"inherit","uploaded_to":15605,"date":"2023-04-06 13:15:38","modified":"2023-04-06 13:15:38","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1536,"height":1024,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-150x150.png","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-300x200.png","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-768x512.png","medium_large-width":768,"medium_large-height":512,"large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35-1024x683.png","large-width":1024,"large-height":683,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","1536x1536-width":1536,"1536x1536-height":1024,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","2048x2048-width":1536,"2048x2048-height":1024,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/ArturSkowronski_dropwizard_5b19de71-c610-4ea6-b2d3-348df45bfb35.png","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":400}},"weekly_summary":false,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dropwizard returns with parallel 3.0 and 4.0 release - JVM Weekly vol. 130 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dropwizard returns with parallel 3.0 and 4.0 release - JVM Weekly vol. 130 - Vived\" \/>\n<meta property=\"og:description\" content=\"I wasn&#039;t here a week ago (I had a speech at JUG and time-wise I didn&#039;t make it anymore), but that doesn&#039;t mean that somehow a lot has happened during my absence. Nevertheless, I have two JEPs for you today, as well as some exceptionally interesting new releases.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-06T12:38:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-07T09:10:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Dropwizard returns with parallel 3.0 and 4.0 release &#8211; JVM Weekly vol. 130\",\"datePublished\":\"2023-04-06T12:38:36+00:00\",\"dateModified\":\"2023-04-07T09:10:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\"},\"wordCount\":1373,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\",\"url\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\",\"name\":\"Dropwizard returns with parallel 3.0 and 4.0 release - JVM Weekly vol. 130 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png\",\"datePublished\":\"2023-04-06T12:38:36+00:00\",\"dateModified\":\"2023-04-07T09:10:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dropwizard returns with parallel 3.0 and 4.0 release &#8211; JVM Weekly vol. 130\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dropwizard returns with parallel 3.0 and 4.0 release - JVM Weekly vol. 130 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/","og_locale":"pl_PL","og_type":"article","og_title":"Dropwizard returns with parallel 3.0 and 4.0 release - JVM Weekly vol. 130 - Vived","og_description":"I wasn't here a week ago (I had a speech at JUG and time-wise I didn't make it anymore), but that doesn't mean that somehow a lot has happened during my absence. Nevertheless, I have two JEPs for you today, as well as some exceptionally interesting new releases.","og_url":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/","og_site_name":"Vived","article_published_time":"2023-04-06T12:38:36+00:00","article_modified_time":"2023-04-07T09:10:06+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Dropwizard returns with parallel 3.0 and 4.0 release &#8211; JVM Weekly vol. 130","datePublished":"2023-04-06T12:38:36+00:00","dateModified":"2023-04-07T09:10:06+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/"},"wordCount":1373,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/","url":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/","name":"Dropwizard returns with parallel 3.0 and 4.0 release - JVM Weekly vol. 130 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png","datePublished":"2023-04-06T12:38:36+00:00","dateModified":"2023-04-07T09:10:06+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/JVM-Weekly-1200x628_V2-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/dropwizard-returns-with-parallel-3-0-and-4-0-release-jvm-weekly-vol-130\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Dropwizard returns with parallel 3.0 and 4.0 release &#8211; JVM Weekly vol. 130"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>1. JEP 401: Implicitly Value Object Creation (Preview)<\/h2>\n","innerContent":["\n<h2>1. JEP 401: Implicitly Value Object Creation (Preview)<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Project Valhalla strikes again and materializes another set of changes in the form of <a href=\"https:\/\/openjdk.org\/jeps\/402\">JEP 401: Implicitly Value Object Creation (Preview)<\/a> This is interesting, since the whole proposal was until recently called <strong>Null-Restricted Value Object Storage<\/strong> and even before that <strong>Primitive Classes<\/strong>.<\/p>\n","innerContent":["\n<p>Project Valhalla strikes again and materializes another set of changes in the form of <a href=\"https:\/\/openjdk.org\/jeps\/402\">JEP 401: Implicitly Value Object Creation (Preview)<\/a> This is interesting, since the whole proposal was until recently called <strong>Null-Restricted Value Object Storage<\/strong> and even before that <strong>Primitive Classes<\/strong>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15609,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-15609\"\/><figcaption class=\"wp-element-caption\">You can't get bored with Valhalla.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-15609\"\/><figcaption class=\"wp-element-caption\">You can't get bored with Valhalla.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>However, getting to the point, this JEP aims to improve the performance of storing Value classes - ones designed to have a similar performance profile to primitive types, but with additional benefits (such as the ability to create abstractions and encapsulation) provided by fact, they are classes. This is quite an oversimplification, but Valhalla probably was the basis for several PhDs, so it's better this way.\n\n\n\n<\/p>\n","innerContent":["\n<p>However, getting to the point, this JEP aims to improve the performance of storing Value classes - ones designed to have a similar performance profile to primitive types, but with additional benefits (such as the ability to create abstractions and encapsulation) provided by fact, they are classes. This is quite an oversimplification, but Valhalla probably was the basis for several PhDs, so it's better this way.\n\n\n\n<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Value classes are designed to be faster and use less memory than regular classes. However, they are limited in use because they do not allow null values and are not atomic, meaning they cannot be modified by multiple threads simultaneously.<\/p>\n","innerContent":["\n<p>Value classes are designed to be faster and use less memory than regular classes. However, they are limited in use because they do not allow null values and are not atomic, meaning they cannot be modified by multiple threads simultaneously.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To address these limitations, JEP introduces two new features: optional constructors and null-restricted types, the introduction of which was discussed at one time on mailing lists. Optional constructors allow programmers to create instances of value classes in a different way than is the case with other classes - it is possible, for example, to omit the constructor. On the other hand, null-restricted types allow programmers to declare that a variable or a value returned by a method cannot have a null value and automatically initialize variables with a default instance of the class when they are created (that's why optional constructors are needed).<\/p>\n","innerContent":["\n<p>To address these limitations, JEP introduces two new features: optional constructors and null-restricted types, the introduction of which was discussed at one time on mailing lists. Optional constructors allow programmers to create instances of value classes in a different way than is the case with other classes - it is possible, for example, to omit the constructor. On the other hand, null-restricted types allow programmers to declare that a variable or a value returned by a method cannot have a null value and automatically initialize variables with a default instance of the class when they are created (that's why optional constructors are needed).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>It also provides additional syntax. To show it, I'll show an excerpt from the original JEP. If you are curious to see what the additional null handling syntax will look like, we are talking about such:<\/p>\n","innerContent":["\n<p>It also provides additional syntax. To show it, I'll show an excerpt from the original JEP. If you are curious to see what the additional null handling syntax will look like, we are talking about such:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>interface Foo&lt;T&gt; {\n    T* get(); \/\/ Foo&lt;char&gt; returns char\n    T! getNonNull(); \/\/ Foo&lt;char&gt; returns char\n    T? getOrNull(); \/\/ Foo&lt;char&gt; returns Character?\n    T getOrAlternate(Supplier&lt;T&gt; alt); Foo&lt;char&gt; returns Character\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>interface Foo&lt;T&gt; {\n    T* get(); \/\/ Foo&lt;char&gt; returns char\n    T! getNonNull(); \/\/ Foo&lt;char&gt; returns char\n    T? getOrNull(); \/\/ Foo&lt;char&gt; returns Character?\n    T getOrAlternate(Supplier&lt;T&gt; alt); Foo&lt;char&gt; returns Character\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15613,"width":491,"height":370,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-15613\" width=\"491\" height=\"370\"\/><figcaption class=\"wp-element-caption\">I sense Kotlin, despite the fact that JDK creators quite often shy away from this inspiration<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-15613\" width=\"491\" height=\"370\"\/><figcaption class=\"wp-element-caption\">I sense Kotlin, despite the fact that JDK creators quite often shy away from this inspiration<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Of course, a lot more is probably happening beneath the surface, as we're only talking about the Draft here, so things can change. To emphasize how early a version we are dealing with - JEP 401 links to <a href=\"https:\/\/openjdk.org\/jeps\/8303099\">Nullness Marker JEP<\/a> which.... does not yet exist. At the time of writing, the link returns a 404 response.<\/p>\n","innerContent":["\n<p>Of course, a lot more is probably happening beneath the surface, as we're only talking about the Draft here, so things can change. To emphasize how early a version we are dealing with - JEP 401 links to <a href=\"https:\/\/openjdk.org\/jeps\/8303099\">Nullness Marker JEP<\/a> which.... does not yet exist. At the time of writing, the link returns a 404 response.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. JEP 443: Unnamed Patterns and Variables<\/h2>\n","innerContent":["\n<h2>2. JEP 443: Unnamed Patterns and Variables<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>After a rather complicated, very early-stage JEP on Valhalla, we will look at the somewhat simpler <a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443: Unnamed Patterns and Variables (Preview)<\/a>, which recently reached candidate status.<\/p>\n","innerContent":["\n<p>After a rather complicated, very early-stage JEP on Valhalla, we will look at the somewhat simpler <a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443: Unnamed Patterns and Variables (Preview)<\/a>, which recently reached candidate status.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Let's start with unnamed patterns. Consider the following code:<\/p>\n","innerContent":["\n<p>Let's start with unnamed patterns. Consider the following code:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>record Point(int x, int y) {}\nrecord ColoredPoint(Point point, String color) {}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>record Point(int x, int y) {}\nrecord ColoredPoint(Point point, String color) {}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Let's assume that we want to extract the x-coordinate of an instance of ColoredPoint, but we don't care about its color. We can do this using an unnamed pattern:\n\n\n\n<\/p>\n","innerContent":["\n<p>Let's assume that we want to extract the x-coordinate of an instance of ColoredPoint, but we don't care about its color. We can do this using an unnamed pattern:\n\n\n\n<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>ColoredPoint coloredPoint = new ColoredPoint(new Point(3, 4), \"red\");\n\nif (coloredPoint instanceof ColoredPoint(Point(int x, _), _)) {\n    System.out.println(\"x-coordinate is \" + x);\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ColoredPoint coloredPoint = new ColoredPoint(new Point(3, 4), \"red\");\n\nif (coloredPoint instanceof ColoredPoint(Point(int x, _), _)) {\n    System.out.println(\"x-coordinate is \" + x);\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>In this example, the \"Unnamed Pattern\" is represented by the underscore symbol <code>_<\/code> in the <code>color<\/code> parameter position of the pattern. This allows us to extract the <code>x<\/code> coordinate of the <code>Point<\/code> component without having to specify the name or type of the <code>color<\/code> field.<\/p>\n","innerContent":["\n<p>In this example, the \"Unnamed Pattern\" is represented by the underscore symbol <code>_<\/code> in the <code>color<\/code> parameter position of the pattern. This allows us to extract the <code>x<\/code> coordinate of the <code>Point<\/code> component without having to specify the name or type of the <code>color<\/code> field.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>We already know what Unnamed Patterns are, let's move on to what Unnamed Variables refer to.<\/p>\n","innerContent":["\n<p>We already know what Unnamed Patterns are, let's move on to what Unnamed Variables refer to.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Consider the following code, which enqueus data from a queue and creates instances of <code>Point2D<\/code> from a list of coordinates in 3D space.<\/p>\n","innerContent":["\n<p>Consider the following code, which enqueus data from a queue and creates instances of <code>Point2D<\/code> from a list of coordinates in 3D space.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    int x = queue.remove();\n    int y = queue.remove();\n    int z = queue.remove();\n    points.add(new Point2D(x, y));\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    int x = queue.remove();\n    int y = queue.remove();\n    int z = queue.remove();\n    points.add(new Point2D(x, y));\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15635,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-15635\"\/><figcaption class=\"wp-element-caption\">If the above seems strange to you, you just proved to me that you don't take part in <a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a>.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-15635\"\/><figcaption class=\"wp-element-caption\">If the above seems strange to you, you just proved to me that you don't take part in <a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a>.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>As you can see, in each pass of the loop we drop the value of <code>z<\/code>. In this case, we can declare this variable as unnamed using the <code>_<\/code> symbol (a bit like in Scala):<\/p>\n","innerContent":["\n<p>As you can see, in each pass of the loop we drop the value of <code>z<\/code>. In this case, we can declare this variable as unnamed using the <code>_<\/code> symbol (a bit like in Scala):<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    var x = queue.remove();\n    int y = queue.remove();\n    var _ = queue.remove();\n    points.add(new Point2D(x, y));\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Queue&lt;Integer&gt; queue = new LinkedList&lt;&gt;(List.of(1, 2, 3, 4, 5, 6));\nList&lt;Point2D&gt; points = new ArrayList&lt;&gt;();\n\nwhile (queue.size() &gt;= 2) {\n    var x = queue.remove();\n    int y = queue.remove();\n    var _ = queue.remove();\n    points.add(new Point2D(x, y));\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>This allows us to focus on the variable <code>x<\/code> and <code>y<\/code>, which are the only ones that are valid in this context. The <code>_<\/code> symbol is used as a placeholder for an unused variable and cannot be used anywhere else in the code because it has no name.<\/p>\n","innerContent":["\n<p>This allows us to focus on the variable <code>x<\/code> and <code>y<\/code>, which are the only ones that are valid in this context. The <code>_<\/code> symbol is used as a placeholder for an unused variable and cannot be used anywhere else in the code because it has no name.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Honestly, the above example doesn't convince me either, but the authors claim that unnamed variables can be useful in situations where variable names are irrelevant or when variables are not used and can improve code readability and maintainability. Additionally, unnamed variables can help reduce false alarms generated by static analysis tools that draw attention to unused variables. Personally, I see the biggest potential for unnamed variables in the case of exception parameters, although the following example also seems to be a code smell:<\/p>\n","innerContent":["\n<p>Honestly, the above example doesn't convince me either, but the authors claim that unnamed variables can be useful in situations where variable names are irrelevant or when variables are not used and can improve code readability and maintainability. Additionally, unnamed variables can help reduce false alarms generated by static analysis tools that draw attention to unused variables. Personally, I see the biggest potential for unnamed variables in the case of exception parameters, although the following example also seems to be a code smell:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>try {\n    ...\n} catch (NumberFormatException _) { \n    System.out.println(\"Bad number\");\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>try {\n    ...\n} catch (NumberFormatException _) { \n    System.out.println(\"Bad number\");\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Release Radar: Dropwizard 3.0 i 4.0<\/h2>\n","innerContent":["\n<h2>3. Release Radar: Dropwizard 3.0 i 4.0<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>I remember the days when I used Dropwizard, when this promising framework was at the height of its popularity. I thought it was the future of web application development and would remain in the minds of developers for a long time. Unfortunately, life and the market turned out differently. Despite the initial enthusiasm, Dropwizard started to lose its importance, and other tools and technologies overshadowed its glory. Today, as we observe the simultaneous release of versions 3.0 and 4.0, this event goes unnoticed in the world of technology, which only shows how much the perception of this once promising project has changed.\n\n\n\n<\/p>\n","innerContent":["\n<p>I remember the days when I used Dropwizard, when this promising framework was at the height of its popularity. I thought it was the future of web application development and would remain in the minds of developers for a long time. Unfortunately, life and the market turned out differently. Despite the initial enthusiasm, Dropwizard started to lose its importance, and other tools and technologies overshadowed its glory. Today, as we observe the simultaneous release of versions 3.0 and 4.0, this event goes unnoticed in the world of technology, which only shows how much the perception of this once promising project has changed.\n\n\n\n<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>What really catches your attention is the joint release of versions 3 and 4, which can be a bit confusing. The reason for the two versions is simple: Dropwizard 3.0.0 is based on Java EE and the <code>javax.<\/code> namespace, so migrating from Dropwizard 2.x to version 3.0.0 should be minimal for many projects. Dropwizard 4.0.0, on the other hand, relies on Jakarta EE dependencies and the <code>jakarta.<\/code> namespace, which may involve more work to migrate from Dropwizard 2.x to version 4.0.0 due to more package changes and more significant dependency changes.<\/p>\n","innerContent":["\n<p>What really catches your attention is the joint release of versions 3 and 4, which can be a bit confusing. The reason for the two versions is simple: Dropwizard 3.0.0 is based on Java EE and the <code>javax.<\/code> namespace, so migrating from Dropwizard 2.x to version 3.0.0 should be minimal for many projects. Dropwizard 4.0.0, on the other hand, relies on Jakarta EE dependencies and the <code>jakarta.<\/code> namespace, which may involve more work to migrate from Dropwizard 2.x to version 4.0.0 due to more package changes and more significant dependency changes.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>The two versions also share some common changes - raising the required Java version to 11, introducing a package structure based on JPMS (I have a feeling it's one of the first tools taking this standard seriously), updating Jetty to 10.0.x (which also requires a minimum of Java 11), updating Apache HttpClient to 5.x, and removing support for JUnit 4.x (moved to <code>dropwizard-testing-junit4<\/code>). In addition, Dropwizard 4.0 will get support for Hibernate 6.0, requiring a move to <code>jakarta.<\/code>.<\/p>\n","innerContent":["\n<p>The two versions also share some common changes - raising the required Java version to 11, introducing a package structure based on JPMS (I have a feeling it's one of the first tools taking this standard seriously), updating Jetty to 10.0.x (which also requires a minimum of Java 11), updating Apache HttpClient to 5.x, and removing support for JUnit 4.x (moved to <code>dropwizard-testing-junit4<\/code>). In addition, Dropwizard 4.0 will get support for Hibernate 6.0, requiring a move to <code>jakarta.<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15617,"width":512,"height":330,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png\" alt=\"\" class=\"wp-image-15617\" width=\"512\" height=\"330\"\/><figcaption class=\"wp-element-caption\">I know that it is not so complicated, but still, some diagrams would be useful.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-10-1024x660.png\" alt=\"\" class=\"wp-image-15617\" width=\"512\" height=\"330\"\/><figcaption class=\"wp-element-caption\">I know that it is not so complicated, but still, some diagrams would be useful.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>The community's reaction to Dropwizard 3.0 and 4.0 is quite mixed. Some programmers welcome the new releases with perhaps not excitement, but at least some nostalgia (I myself belong to this group). Ardent fans of Dropwizard talk about its \"virtually bug-free\" nature and use of proven dependencies. It's like an old, cozy sweater that you don't feel the need to throw away. They also appreciate that Dropwizard is not a control freak, unlike some other frameworks (ahem, Spring Boot), allowing programmers to mix and match components as they please.<\/p>\n","innerContent":["\n<p>The community's reaction to Dropwizard 3.0 and 4.0 is quite mixed. Some programmers welcome the new releases with perhaps not excitement, but at least some nostalgia (I myself belong to this group). Ardent fans of Dropwizard talk about its \"virtually bug-free\" nature and use of proven dependencies. It's like an old, cozy sweater that you don't feel the need to throw away. They also appreciate that Dropwizard is not a control freak, unlike some other frameworks (ahem, Spring Boot), allowing programmers to mix and match components as they please.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>However, there are also those who believe that Dropwizard is starting to show its age. They argue that more elegant and shiny frameworks have entered the scene, such as Micronaut, Quarkus, and Helidon, which offer modern features such as reactive programming, better performance, and being cloud-native. I don't think the new version (or rather versions) will be able to change this situation much.<\/p>\n","innerContent":["\n<p>However, there are also those who believe that Dropwizard is starting to show its age. They argue that more elegant and shiny frameworks have entered the scene, such as Micronaut, Quarkus, and Helidon, which offer modern features such as reactive programming, better performance, and being cloud-native. I don't think the new version (or rather versions) will be able to change this situation much.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15622,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/yeah-i-member-memberberries.gif\" alt=\"\" class=\"wp-image-15622\"\/><figcaption class=\"wp-element-caption\">Does anyone else remember Dropwizard?<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/yeah-i-member-memberberries.gif\" alt=\"\" class=\"wp-image-15622\"\/><figcaption class=\"wp-element-caption\">Does anyone else remember Dropwizard?<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>4. Release Radar: Hibernate 6.20<\/h2>\n","innerContent":["\n<h2>4. Release Radar: Hibernate 6.20<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>And finally, the new Hibernate ORM 6.2.<\/p>\n","innerContent":["\n<p>And finally, the new Hibernate ORM 6.2.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>The release introduces better support for structured SQL types such as Struct, XML, and JSON, allowing users to work with more complex data structures. Related to this feature is the ability to user Records, which enables Hibernate to deserialize the aforementioned structural types in both directions.<\/p>\n","innerContent":["\n<p>The release introduces better support for structured SQL types such as Struct, XML, and JSON, allowing users to work with more complex data structures. Related to this feature is the ability to user Records, which enables Hibernate to deserialize the aforementioned structural types in both directions.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>The release also unifies the annotations used to generate values. What's more, Hibernate now offers full support for database partitions using the <code>@PartitionKey<\/code> annotation, which simplifies the partition column mapping process.<\/p>\n","innerContent":["\n<p>The release also unifies the annotations used to generate values. What's more, Hibernate now offers full support for database partitions using the <code>@PartitionKey<\/code> annotation, which simplifies the partition column mapping process.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>The last noteworthy feature of Hibernate ORM 6.2.0 is the implementation of SQL MERGE. This mechanism works in a similar way to UPSERT, but it is much more powerful as it allows not only updating but also deleting records, as well as providing additional conditions for the query, such as:<\/p>\n","innerContent":["\n<p>The last noteworthy feature of Hibernate ORM 6.2.0 is the implementation of SQL MERGE. This mechanism works in a similar way to UPSERT, but it is much more powerful as it allows not only updating but also deleting records, as well as providing additional conditions for the query, such as:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;\nON CONFLICT (country) DO NOTHING;<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;\nON CONFLICT (country) DO NOTHING;<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Although Hibernate uses it in a way that is invisible to the end user, this novelty has allowed me to expand my knowledge of SQL a bit, so I'm sharing it.<\/p>\n","innerContent":["\n<p>Although Hibernate uses it in a way that is invisible to the end user, this novelty has allowed me to expand my knowledge of SQL a bit, so I'm sharing it.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15625,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-15625\"\/><figcaption class=\"wp-element-caption\">I have a feeling that with SQL it's like with Excel - everyone criticizes it while using only 10% of its capabilities.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-15625\"\/><figcaption class=\"wp-element-caption\">I have a feeling that with SQL it's like with Excel - everyone criticizes it while using only 10% of its capabilities.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A, and there was also Kotlin 1.8.20, but since KotlinConf is coming up next week, we will cover this topic in the next edition, probably heavily focused on that particular language.<\/p>\n","innerContent":["\n<p>A, and there was also Kotlin 1.8.20, but since KotlinConf is coming up next week, we will cover this topic in the next edition, probably heavily focused on that particular language.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15644","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=15644"}],"version-history":[{"count":9,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15644\/revisions"}],"predecessor-version":[{"id":15677,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15644\/revisions\/15677"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/15646"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=15644"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=15644"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=15644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}