{"id":22707,"date":"2025-05-01T01:22:52","date_gmt":"2025-04-30T23:22:52","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22707"},"modified":"2025-05-02T08:09:33","modified_gmt":"2025-05-02T06:09:33","slug":"java-records-zum-tag-der-arbeit","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22707","title":{"rendered":"Java Records zum Tag der Arbeit (1)"},"content":{"rendered":"<p>Mit der Einf\u00fchrung von <a href=\"http:\/\/blog.wenzlaff.de\/?cat=6202\" target=\"_blank\">Records<\/a> hat Java einen eleganten Weg geschaffen, um unver\u00e4nderliche Datenobjekte effizient und ausdrucksstark zu modellieren. Records ersetzen den klassischen, oft umfangreichen Boilerplate-Code f\u00fcr Datenklassen durch eine kompakte, deklarative Syntax. Sie eignen sich hervorragend f\u00fcr Value Objects, Data Transfer Objects (DTOs) oder als R\u00fcckgabetypen in APIs.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records.jpg\" alt=\"\" width=\"1920\" height=\"1080\" class=\"aligncenter size-full wp-image-22710\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records.jpg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-300x169.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-1024x576.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-768x432.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-1536x864.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p><strong>Was sind Java Records?<\/strong><\/p>\n<p>Ein Record ist ein spezieller Klassentyp, der f\u00fcr die Speicherung von Daten entwickelt wurde. Die Felder eines Records sind <em>automatisch<\/em> <strong>private<\/strong> und <strong>final<\/strong>, der Zustand eines Record-Objekts kann nach der Erstellung <strong>nicht<\/strong> mehr ver\u00e4ndert werden. Konstruktor, Getter-Methoden, sowie sinnvolle Implementierungen von equals(), hashCode() und toString() werden automatisch generiert. <!--more--><\/p>\n<p><strong>Beispiel<\/strong><\/p>\n<pre class=\"lang:default decode:true \" >public record Person(String name, int age) {}<\/pre>\n<p>Mit nur einer Zeile Code erh\u00e4lt man eine voll ausgestattete, unver\u00e4nderliche Datenklasse.<\/p>\n<p>Oder:<\/p>\n<pre class=\"lang:default decode:true \" >public record KalenderParam(File fileName,\r\n\t\tLocalDate targetDate, \r\n\t\tLocalDate fromDate,\r\n\t\tString summaryText,\r\n\t\tList&lt;String&gt; selectedWorkday) {\r\n\t\r\n\t\/\/ Zus\u00e4tzlicher Konstruktor mit weniger Parametern optional m\u00f6glich, dann aber immer mit this\r\n\t\/\/ Jeder zus\u00e4tzliche Konstruktor muss letztlich den kanonischen Konstruktor aufrufen, also mit `this(...)` initialisieren\r\n\t\/\/ Die Anzahl der Argumente in zus\u00e4tzlichen Konstruktoren darf nicht gr\u00f6\u00dfer sein als die der Record-Komponenten\r\n\r\n\t\/\/ public KalenderParam(File fileName, LocalDate targetDate) {\r\n    \/\/    this(fileName, targetDate, null, \"\", List.of());\r\n    \/\/ }\r\n\r\n\t\/\/  in einer Java-Record-Klasse kannst du statische Methoden definieren. Records unterst\u00fctzen statische Methoden und statische Felder genauso wie normale Klassen\r\n\r\n\t\/\/ public static KalenderParam empty() {\r\n    \/\/  return new KalenderParam(null, null, null, \"\", List.of());\r\n    \/\/}\r\n\t\r\n}<\/pre>\n<p><strong>Eigenschaften und Vorteile<\/strong><\/p>\n<p>&#8211;<strong>Immutabilit\u00e4t<\/strong>: Die Daten eines Records sind nach der Instanziierung fest und k\u00f6nnen nicht mehr ver\u00e4ndert werden.<\/p>\n<p>&#8211;<strong>Automatisch generierte Methoden<\/strong>: Konstruktor, Getter, equals(), hashCode() und toString() werden vom Compiler bereitgestellt.<\/p>\n<p>&#8211;<strong>Kompakte Syntax<\/strong>: Records reduzieren den Quellcode und erh\u00f6hen die Lesbarkeit.<\/p>\n<p>&#8211;<strong>Erweiterbarkeit<\/strong>: Eigene Methoden, zus\u00e4tzliche Konstruktoren und statische Hilfsmethoden lassen sich problemlos erg\u00e4nzen.<\/p>\n<p>&#8211;<strong>Sicherheit<\/strong>: Durch die Unver\u00e4nderlichkeit eignen sich Records besonders f\u00fcr den parallelen Einsatz und die \u00dcbertragung sensibler Daten.<\/p>\n<p><strong>Einschr\u00e4nkungen<\/strong><\/p>\n<p>&#8211; Records sind immer <strong>final<\/strong> und k\u00f6nnen nicht erweitert werden.<\/p>\n<p>&#8211; Sie k\u00f6nnen Interfaces implementieren, aber keine andere Klasse erben.<\/p>\n<p>&#8211; Felder d\u00fcrfen <em>nicht<\/em> ver\u00e4ndert werden und <em>m\u00fcssen<\/em> im Konstruktor initialisiert werden.<\/p>\n<p>&#8211; Records sind nicht f\u00fcr komplexes Verhalten oder Zustandsverwaltung gedacht, sondern f\u00fcr die reine Datenhaltung.<\/p>\n<p>Java Records sind ein modernes Sprachfeature, das die Entwicklung von Datenklassen erheblich vereinfacht. Sie f\u00f6rdern sauberen, sicheren und wartbaren Code und sind aus der zeitgem\u00e4\u00dfen Java-Programmierung nicht mehr wegzudenken. <\/p>\n<p>Wer Wert auf \u00dcbersichtlichkeit und Immutabilit\u00e4t legt, sollte Records als Standard f\u00fcr Datenobjekte einsetzen.<\/p>\n<p>Dann starten wir hiermit mal die <a href=\"http:\/\/blog.wenzlaff.de\/?cat=6202\" target=\"_blank\">Java 21 Challenge<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit der Einf\u00fchrung von Records hat Java einen eleganten Weg geschaffen, um unver\u00e4nderliche Datenobjekte effizient und ausdrucksstark zu modellieren. Records ersetzen den klassischen, oft umfangreichen Boilerplate-Code f\u00fcr Datenklassen durch eine kompakte, deklarative Syntax. Sie eignen sich hervorragend f\u00fcr Value Objects, Data Transfer Objects (DTOs) oder als R\u00fcckgabetypen in APIs. Was sind Java Records? Ein Record &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22707\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eJava Records zum Tag der Arbeit (1)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,6201,5,6202,79],"tags":[6197,2178,167,6196,6199,6198,6200],"class_list":["post-22707","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-challenge","category-java","category-java-21-challenge","category-programmierung","tag-bes","tag-java","tag-programmieren","tag-records","tag-records-challenge","tag-records-tag","tag-recordschallenge"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22707"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22707\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22707"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}