{"id":399,"date":"2024-05-18T10:00:18","date_gmt":"2024-05-18T09:00:18","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=399"},"modified":"2024-06-07T10:00:31","modified_gmt":"2024-06-07T09:00:31","slug":"java-records-eine-einfuehrung-und-anwendung","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=399","title":{"rendered":"Java Records: Eine Einf\u00fchrung und Anwendung"},"content":{"rendered":"\n<p>Java Records sind eine der spannendsten Neuerungen, die mit Java 14 eingef\u00fchrt und in Java 16 stabilisiert wurden. Sie bieten eine schlanke und effiziente M\u00f6glichkeit, unver\u00e4nderliche Datentypen zu definieren. In diesem Artikel werden wir die Grundlagen von Java Records beleuchten, ihre Vorteile und Einschr\u00e4nkungen aufzeigen und einige praktische Anwendungsbeispiele pr\u00e4sentieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was sind Java Records?<\/h2>\n\n\n\n<p>Ein Record in Java ist eine spezielle Art von Klasse, die haupts\u00e4chlich daf\u00fcr gedacht ist, einfache Datentr\u00e4ger (data carriers) zu definieren. Sie zeichnen sich dadurch aus, dass sie automatisch viele der Boilerplate-Codes (z.B. Konstruktoren, Getter, <code>equals<\/code>, <code>hashCode<\/code> und <code>toString<\/code> Methoden) generieren, die man normalerweise f\u00fcr einfache Datenklassen schreiben m\u00fcsste. Ein Record wird durch das Schl\u00fcsselwort <code>record<\/code> eingef\u00fchrt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Syntax eines Records<\/h3>\n\n\n\n<p>Die Syntax eines Records ist denkbar einfach:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">public<\/span> <span class=\"hljs-selector-tag\">record<\/span> <span class=\"hljs-selector-tag\">Point<\/span>(<span class=\"hljs-selector-tag\">int<\/span> <span class=\"hljs-selector-tag\">x<\/span>, <span class=\"hljs-selector-tag\">int<\/span> <span class=\"hljs-selector-tag\">y<\/span>) {}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird ein <code>Point<\/code> Record definiert, der zwei Felder <code>x<\/code> und <code>y<\/code> enth\u00e4lt. Diese einfache Definition generiert automatisch einen Konstruktor, der die beiden Felder initialisiert, sowie die Methoden <code>equals<\/code>, <code>hashCode<\/code> und <code>toString<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorteile von Java Records<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Reduzierter Boilerplate-Code<\/h3>\n\n\n\n<p>Einer der gr\u00f6\u00dften Vorteile von Records ist die Reduzierung des Boilerplate-Codes. In traditionellen Java-Klassen m\u00fcsste man Konstruktoren, Getter, <code>equals<\/code>, <code>hashCode<\/code> und <code>toString<\/code>-Methoden manuell implementieren. Mit Records \u00fcbernimmt der Compiler diese Arbeit automatisch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Unver\u00e4nderlichkeit<\/h3>\n\n\n\n<p>Records sind unver\u00e4nderlich (immutable). Das bedeutet, dass einmal gesetzte Werte der Felder nicht mehr ge\u00e4ndert werden k\u00f6nnen. Dies erleichtert das Schreiben von Thread-sicherem Code und verbessert die Lesbarkeit und Wartbarkeit des Codes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Klare Semantik<\/h3>\n\n\n\n<p>Records sind ideal, um reine Datencontainer darzustellen. Sie kommunizieren klar die Absicht, dass die Klasse nur Daten h\u00e4lt, ohne zus\u00e4tzliche Gesch\u00e4ftslogik oder Verhalten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einschr\u00e4nkungen von Java Records<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Keine Vererbung<\/h3>\n\n\n\n<p>Records k\u00f6nnen keine anderen Klassen erweitern (sie sind automatisch final) und k\u00f6nnen nicht von anderen Klassen abgeleitet werden. Dies liegt daran, dass Records eine klare, einfache Struktur f\u00fcr Datencontainer beibehalten sollen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keine Methoden au\u00dfer Standardmethoden<\/h3>\n\n\n\n<p>Obwohl man zus\u00e4tzliche Methoden zu einem Record hinzuf\u00fcgen kann, d\u00fcrfen diese Methoden keine Felder ver\u00e4ndern. Dies ist eine Konsequenz aus der Unver\u00e4nderlichkeit von Records.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Feste Struktur<\/h3>\n\n\n\n<p>Einmal definierte Felder in einem Record k\u00f6nnen nicht mehr ver\u00e4ndert werden. Dies bedeutet, dass die Struktur eines Records sehr starr ist und \u00c4nderungen in der Datenstruktur neue Record-Definitionen erfordern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Anwendungsbeispiele f\u00fcr Java Records<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Einfache Datencontainer<\/h3>\n\n\n\n<p>Records eignen sich hervorragend als einfache Datencontainer. Zum Beispiel k\u00f6nnte man ein Record f\u00fcr ein geografisches Koordinatensystem definieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">public<\/span> <span class=\"hljs-selector-tag\">record<\/span> <span class=\"hljs-selector-tag\">GeoCoordinate<\/span>(<span class=\"hljs-selector-tag\">double<\/span> <span class=\"hljs-selector-tag\">latitude<\/span>, <span class=\"hljs-selector-tag\">double<\/span> <span class=\"hljs-selector-tag\">longitude<\/span>) {}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dieser Record stellt sicher, dass die Koordinatenwerte nach ihrer Initialisierung nicht mehr ver\u00e4ndert werden k\u00f6nnen, was insbesondere in geografischen Anwendungen wichtig ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Data Transfer Objects (DTOs)<\/h3>\n\n\n\n<p>Records k\u00f6nnen als DTOs verwendet werden, um Daten zwischen verschiedenen Schichten einer Anwendung zu \u00fcbertragen. Hier ist ein Beispiel f\u00fcr ein DTO, das Kundendaten h\u00e4lt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public record CustomerDTO(int id, <span class=\"hljs-built_in\">String<\/span> name, <span class=\"hljs-built_in\">String<\/span> email) {}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dieses DTO kann verwendet werden, um Kundendaten zwischen der Datenbank-Schicht und der Gesch\u00e4ftslogik-Schicht zu \u00fcbertragen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schl\u00fcssel-Wert-Paare<\/h3>\n\n\n\n<p>Records k\u00f6nnen auch verwendet werden, um Schl\u00fcssel-Wert-Paare darzustellen. Dies kann n\u00fctzlich sein, wenn man einfache Konfigurationsdaten oder Eigenschaften speichern m\u00f6chte:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">public record KeyValuePair<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">K,<\/span> <span class=\"hljs-attr\">V<\/span>&gt;<\/span>(K key, V value) {}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Verwendung in Collections<\/h3>\n\n\n\n<p>Records lassen sich nahtlos in Collections verwenden, da sie unver\u00e4nderlich sind und sinnvolle Implementierungen von <code>equals<\/code> und <code>hashCode<\/code> bieten. Zum Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">List<\/span>&lt;Point&gt; points = <span class=\"hljs-keyword\">List<\/span>.of(<span class=\"hljs-keyword\">new<\/span> Point(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>), <span class=\"hljs-keyword\">new<\/span> Point(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird eine Liste von <code>Point<\/code> Records erstellt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Java Records bieten eine elegante und effiziente M\u00f6glichkeit, unver\u00e4nderliche Datentypen zu definieren. Sie reduzieren den Boilerplate-Code, verbessern die Lesbarkeit und Wartbarkeit des Codes und bieten klare Semantik f\u00fcr einfache Datencontainer. Obwohl sie einige Einschr\u00e4nkungen haben, wie die fehlende Unterst\u00fctzung f\u00fcr Vererbung und die starre Struktur, sind sie in vielen Szenarien \u00e4u\u00dferst n\u00fctzlich.<\/p>\n\n\n\n<p>Mit der Einf\u00fchrung von Records hat Java einen gro\u00dfen Schritt gemacht, um die Entwicklererfahrung zu verbessern und moderne Programmierparadigmen zu unterst\u00fctzen. In vielen F\u00e4llen, in denen einfache Datenstrukturen ben\u00f6tigt werden, sind Records die ideale Wahl.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java Records sind eine der spannendsten Neuerungen, die mit Java 14 eingef\u00fchrt und in Java 16 stabilisiert wurden. Sie bieten eine schlanke und effiziente M\u00f6glichkeit, unver\u00e4nderliche Datentypen zu definieren. In diesem Artikel werden wir die Grundlagen von Java Records beleuchten, ihre Vorteile und Einschr\u00e4nkungen aufzeigen und einige praktische Anwendungsbeispiele pr\u00e4sentieren. Was sind Java Records? Ein [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-399","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=399"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/399\/revisions"}],"predecessor-version":[{"id":400,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/399\/revisions\/400"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}