{"id":395,"date":"2024-05-16T09:55:16","date_gmt":"2024-05-16T08:55:16","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=395"},"modified":"2024-06-07T09:56:51","modified_gmt":"2024-06-07T08:56:51","slug":"die-immutables-library-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=395","title":{"rendered":"Die Immutables-Library in Java"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Einf\u00fchrung in die Immutables-Bibliothek<\/h3>\n\n\n\n<p>In der Softwareentwicklung sind Unver\u00e4nderlichkeit und Immutabilit\u00e4t wichtige Konzepte, die zur Verbesserung der Robustheit und Vorhersagbarkeit von Anwendungen beitragen k\u00f6nnen. Eine unver\u00e4nderliche Klasse (immutable class) ist eine Klasse, deren Instanzen nach ihrer Erstellung nicht mehr ge\u00e4ndert werden k\u00f6nnen. Java bietet native Unterst\u00fctzung f\u00fcr unver\u00e4nderliche Klassen, wie etwa die <code>String<\/code>-Klasse. Dennoch kann die Implementierung eigener unver\u00e4nderlicher Klassen komplex und fehleranf\u00e4llig sein. Hier kommt die Immutables-Bibliothek ins Spiel, die es erleichtert, unver\u00e4nderliche Objekte zu erstellen.<\/p>\n\n\n\n<p>Die Immutables-Bibliothek ist ein leistungsstarkes Werkzeug zur Erstellung von unver\u00e4nderlichen Objekten in Java. Sie bietet eine Annotation-basierte API, die es Entwicklern erm\u00f6glicht, mit minimalem Aufwand unver\u00e4nderliche Klassen zu erstellen. Die Bibliothek generiert den notwendigen Code automatisch, wodurch sie nicht nur die Entwicklung beschleunigt, sondern auch die Wahrscheinlichkeit von Fehlern reduziert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlagen der Immutables-Bibliothek<\/h3>\n\n\n\n<p>Die Immutables-Bibliothek verwendet eine Annotation-basierte Syntax, um die Erstellung von unver\u00e4nderlichen Objekten zu vereinfachen. Der Hauptbestandteil der Bibliothek ist die <code>@Value.Immutable<\/code> Annotation. Wenn diese Annotation auf eine Schnittstelle oder abstrakte Klasse angewendet wird, generiert die Bibliothek automatisch eine Implementierung dieser Klasse oder Schnittstelle, die unver\u00e4nderlich ist.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Beispiel f\u00fcr eine einfache unver\u00e4nderliche Klasse<\/h4>\n\n\n\n<p>Betrachten wir ein einfaches Beispiel einer unver\u00e4nderlichen Klasse <code>Person<\/code>:<\/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\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.immutables<\/span><span class=\"hljs-selector-class\">.value<\/span><span class=\"hljs-selector-class\">.Value<\/span>;\n\n<span class=\"hljs-keyword\">@Value<\/span>.Immutable\npublic interface Person {\n    <span class=\"hljs-selector-tag\">String<\/span> <span class=\"hljs-selector-tag\">getName<\/span>();\n    <span class=\"hljs-selector-tag\">int<\/span> <span class=\"hljs-selector-tag\">getAge<\/span>();\n}<\/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>Die Immutables-Bibliothek generiert automatisch eine Implementierung dieser Schnittstelle. Die generierte Klasse kann folgenderma\u00dfen verwendet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        Person person = ImmutablePerson.builder()\n                                       .name(<span class=\"hljs-string\">\"John Doe\"<\/span>)\n                                       .age(<span class=\"hljs-number\">30<\/span>)\n                                       .build();\n\n        System.out.println(person.getName()); <span class=\"hljs-comment\">\/\/ Ausgabe: John Doe<\/span>\n        System.out.println(person.getAge());  <span class=\"hljs-comment\">\/\/ Ausgabe: 30<\/span>\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<h3 class=\"wp-block-heading\">Vorteile der Verwendung der Immutables-Bibliothek<\/h3>\n\n\n\n<p>Die Verwendung der Immutables-Bibliothek bietet zahlreiche Vorteile:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Sicherheit und Vorhersagbarkeit:<\/strong> Unver\u00e4nderliche Objekte sind von Natur aus threadsicher und minimieren die Komplexit\u00e4t des Zustandsmanagements. Da der Zustand eines Objekts nach seiner Erstellung nicht ge\u00e4ndert werden kann, wird die Wahrscheinlichkeit von Nebenwirkungen und Race-Conditions verringert.<\/li>\n\n\n\n<li><strong>Konsistenz und Integrit\u00e4t:<\/strong> Da unver\u00e4nderliche Objekte nicht ge\u00e4ndert werden k\u00f6nnen, bleibt ihr Zustand w\u00e4hrend der gesamten Lebensdauer konsistent. Dies ist besonders n\u00fctzlich in Systemen, in denen Datenintegrit\u00e4t von entscheidender Bedeutung ist.<\/li>\n\n\n\n<li><strong>Einfache Implementierung:<\/strong> Die Immutables-Bibliothek automatisiert den Prozess der Erstellung unver\u00e4nderlicher Klassen. Entwickler m\u00fcssen sich nicht mehr um die Implementierung von <code>equals<\/code>, <code>hashCode<\/code> oder <code>toString<\/code> k\u00fcmmern, da diese Methoden automatisch generiert werden.<\/li>\n\n\n\n<li><strong>Verbesserte Lesbarkeit und Wartbarkeit:<\/strong> Der von der Immutables-Bibliothek generierte Code ist gut strukturiert und leicht verst\u00e4ndlich. Dies erleichtert die Wartung und Weiterentwicklung von Anwendungen.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Erweiterte Nutzungsm\u00f6glichkeiten der Immutables-Bibliothek<\/h3>\n\n\n\n<p>Die Immutables-Bibliothek bietet eine Vielzahl von erweiterten Funktionen, die es Entwicklern erm\u00f6glichen, komplexe Anwendungsf\u00e4lle zu bew\u00e4ltigen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Verwendung von Attributen mit Standardwerten<\/h4>\n\n\n\n<p>Es ist m\u00f6glich, Attribute mit Standardwerten zu definieren. Dies kann durch die Verwendung der <code>default<\/code> Methode in der Schnittstelle erreicht werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Value.Immutable\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Car<\/span> <\/span>{\n    String getModel();\n\n    @Value.<span class=\"hljs-keyword\">Default<\/span>\n    <span class=\"hljs-keyword\">default<\/span> String getColor() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Black\"<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<h4 class=\"wp-block-heading\">Erstellen von abgeleiteten Attributen<\/h4>\n\n\n\n<p>Manchmal ist es n\u00fctzlich, abgeleitete Attribute zu haben, die auf anderen Attributen basieren. Dies kann mit der <code>@Value.Derived<\/code> Annotation erreicht werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Value.Immutable\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Rectangle<\/span> <\/span>{\n    int getWidth();\n    int getHeight();\n\n    @Value.Derived\n    <span class=\"hljs-keyword\">default<\/span> int getArea() {\n        <span class=\"hljs-keyword\">return<\/span> getWidth() * getHeight();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<h4 class=\"wp-block-heading\">Verwendung von Optionalen Attributen<\/h4>\n\n\n\n<p>Die Immutables-Bibliothek unterst\u00fctzt auch die Verwendung von Optionalen Attributen mit Hilfe von <code>Optional<\/code> aus <code>java.util<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">java<\/span><span class=\"hljs-selector-class\">.util<\/span><span class=\"hljs-selector-class\">.Optional<\/span>;\n\n<span class=\"hljs-keyword\">@Value<\/span>.Immutable\npublic interface User {\n    <span class=\"hljs-selector-tag\">String<\/span> <span class=\"hljs-selector-tag\">getUsername<\/span>();\n    <span class=\"hljs-selector-tag\">Optional<\/span>&lt;<span class=\"hljs-selector-tag\">String<\/span>&gt; <span class=\"hljs-selector-tag\">getEmail<\/span>();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<h3 class=\"wp-block-heading\">Integration mit anderen Bibliotheken<\/h3>\n\n\n\n<p>Die Immutables-Bibliothek l\u00e4sst sich nahtlos in andere Java-Bibliotheken und Frameworks integrieren, was sie zu einer vielseitigen L\u00f6sung f\u00fcr die Erstellung unver\u00e4nderlicher Objekte macht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">JSON-Serialisierung mit Jackson<\/h4>\n\n\n\n<p>Die Immutables-Bibliothek bietet Unterst\u00fctzung f\u00fcr die Serialisierung und Deserialisierung von JSON-Daten mit Jackson. Dies erfordert die Verwendung zus\u00e4tzlicher Annotationen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">com<\/span><span class=\"hljs-selector-class\">.fasterxml<\/span><span class=\"hljs-selector-class\">.jackson<\/span><span class=\"hljs-selector-class\">.databind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.JsonDeserialize<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.immutables<\/span><span class=\"hljs-selector-class\">.value<\/span><span class=\"hljs-selector-class\">.Value<\/span>;\n\n<span class=\"hljs-keyword\">@Value<\/span>.Immutable\n@JsonDeserialize(as = ImmutablePerson.class)\npublic interface Person {\n    <span class=\"hljs-selector-tag\">String<\/span> <span class=\"hljs-selector-tag\">getName<\/span>();\n    <span class=\"hljs-selector-tag\">int<\/span> <span class=\"hljs-selector-tag\">getAge<\/span>();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>Die Verwendung von Jackson zur Serialisierung und Deserialisierung kann folgenderma\u00dfen erfolgen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.ObjectMapper;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) throws Exception {\n        ObjectMapper mapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n\n        <span class=\"hljs-comment\">\/\/ Serialisierung<\/span>\n        Person person = ImmutablePerson.builder().name(<span class=\"hljs-string\">\"Jane Doe\"<\/span>).age(<span class=\"hljs-number\">25<\/span>).build();\n        <span class=\"hljs-built_in\">String<\/span> json = mapper.writeValueAsString(person);\n        System.out.println(json);\n\n        <span class=\"hljs-comment\">\/\/ Deserialisierung<\/span>\n        Person deserializedPerson = mapper.readValue(json, Person.class);\n        System.out.println(deserializedPerson.getName());\n        System.out.println(deserializedPerson.getAge());\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Die Immutables-Bibliothek ist ein leistungsf\u00e4higes Werkzeug zur Erstellung unver\u00e4nderlicher Klassen in Java. Sie vereinfacht die Implementierung durch automatische Codegenerierung, verbessert die Sicherheit und Vorhersagbarkeit von Anwendungen und bietet erweiterte Funktionen f\u00fcr komplexe Anwendungsf\u00e4lle. Die nahtlose Integration mit anderen Bibliotheken und Frameworks macht sie zu einer wertvollen Erg\u00e4nzung im Werkzeugkasten eines jeden Java-Entwicklers.<\/p>\n\n\n\n<p>Durch die Nutzung der Immutables-Bibliothek k\u00f6nnen Entwickler sauberen, robusten und leicht wartbaren Code schreiben, der den hohen Anforderungen moderner Softwareentwicklung gerecht wird.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung in die Immutables-Bibliothek In der Softwareentwicklung sind Unver\u00e4nderlichkeit und Immutabilit\u00e4t wichtige Konzepte, die zur Verbesserung der Robustheit und Vorhersagbarkeit von Anwendungen beitragen k\u00f6nnen. Eine unver\u00e4nderliche Klasse (immutable class) ist eine Klasse, deren Instanzen nach ihrer Erstellung nicht mehr ge\u00e4ndert werden k\u00f6nnen. Java bietet native Unterst\u00fctzung f\u00fcr unver\u00e4nderliche Klassen, wie etwa die String-Klasse. Dennoch kann [&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-395","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\/395","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=395"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/395\/revisions"}],"predecessor-version":[{"id":396,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/395\/revisions\/396"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=395"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=395"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}