{"id":363,"date":"2024-04-27T18:14:38","date_gmt":"2024-04-27T17:14:38","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=363"},"modified":"2024-06-03T18:15:57","modified_gmt":"2024-06-03T17:15:57","slug":"das-builder-design-pattern-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=363","title":{"rendered":"Das Builder-Design-Pattern in Java"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Einleitung<\/h4>\n\n\n\n<p>Das Builder-Design-Pattern ist eines der bekanntesten und am h\u00e4ufigsten verwendeten Entwurfsmuster in der objektorientierten Programmierung. Es geh\u00f6rt zur Kategorie der Erzeugungsmuster (Creational Patterns) und wird verwendet, um die Konstruktion komplexer Objekte zu vereinfachen und \u00fcbersichtlicher zu gestalten. In Java kann das Builder-Pattern besonders n\u00fctzlich sein, um Objekte zu erzeugen, die viele optionale Parameter haben oder deren Konstruktion aus mehreren Schritten besteht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Problemstellung<\/h4>\n\n\n\n<p>In Java kann das Erzeugen komplexer Objekte mit vielen Parametern und optionalen Attributen schnell un\u00fcbersichtlich werden. Traditionelle Konstruktoren und Setter-Methoden f\u00fchren oft zu folgendem Problem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00dcberladene Konstruktoren:<\/strong> Das Definieren vieler Konstruktoren mit verschiedenen Parameterkombinationen f\u00fchrt zu einem Ph\u00e4nomen, das als &#8222;Constructor Overloading Hell&#8220; bekannt ist.<\/li>\n\n\n\n<li><strong>Un\u00fcbersichtlichkeit und Fehleranf\u00e4lligkeit:<\/strong> Das Setzen vieler Parameter in einem Konstruktoraufruf kann un\u00fcbersichtlich sein und die Wahrscheinlichkeit erh\u00f6hen, dass Parameter in der falschen Reihenfolge \u00fcbergeben werden.<\/li>\n\n\n\n<li><strong>Unver\u00e4nderliche Objekte:<\/strong> Bei unver\u00e4nderlichen Objekten (Immutable Objects) muss sichergestellt werden, dass alle ben\u00f6tigten Parameter bereits beim Erstellen des Objekts vorhanden sind, was mit dem Standardansatz schwierig sein kann.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Das Builder-Pattern<\/h4>\n\n\n\n<p>Das Builder-Pattern l\u00f6st diese Probleme, indem es die Erstellung eines Objekts in separate Schritte aufteilt und dabei eine klare und lesbare API bietet. Ein <code>Builder<\/code> ist eine Hilfsklasse, die schrittweise ein Objekt konfiguriert und schlie\u00dflich erstellt.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Aufbau und Implementierung<\/h4>\n\n\n\n<p>Ein klassisches Beispiel f\u00fcr das Builder-Pattern in Java ist die Erstellung einer komplexen Klasse <code>Person<\/code>, die viele optionale Attribute hat.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">1. Die <code>Person<\/code>-Klasse<\/h5>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" 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\">Person<\/span> <\/span>{\n    private final <span class=\"hljs-built_in\">String<\/span> firstName;  <span class=\"hljs-comment\">\/\/ Pflichtfeld<\/span>\n    private final <span class=\"hljs-built_in\">String<\/span> lastName;   <span class=\"hljs-comment\">\/\/ Pflichtfeld<\/span>\n    private final int age;           <span class=\"hljs-comment\">\/\/ Optional<\/span>\n    private final <span class=\"hljs-built_in\">String<\/span> address;    <span class=\"hljs-comment\">\/\/ Optional<\/span>\n    private final <span class=\"hljs-built_in\">String<\/span> phoneNumber; <span class=\"hljs-comment\">\/\/ Optional<\/span>\n\n    <span class=\"hljs-comment\">\/\/ Privater Konstruktor<\/span>\n    private Person(Builder builder) {\n        <span class=\"hljs-keyword\">this<\/span>.firstName = builder.firstName;\n        <span class=\"hljs-keyword\">this<\/span>.lastName = builder.lastName;\n        <span class=\"hljs-keyword\">this<\/span>.age = builder.age;\n        <span class=\"hljs-keyword\">this<\/span>.address = builder.address;\n        <span class=\"hljs-keyword\">this<\/span>.phoneNumber = builder.phoneNumber;\n    }\n\n    <span class=\"hljs-comment\">\/\/ Getter-Methoden<\/span>\n    public <span class=\"hljs-built_in\">String<\/span> getFirstName() {\n        <span class=\"hljs-keyword\">return<\/span> firstName;\n    }\n\n    public <span class=\"hljs-built_in\">String<\/span> getLastName() {\n        <span class=\"hljs-keyword\">return<\/span> lastName;\n    }\n\n    public int getAge() {\n        <span class=\"hljs-keyword\">return<\/span> age;\n    }\n\n    public <span class=\"hljs-built_in\">String<\/span> getAddress() {\n        <span class=\"hljs-keyword\">return<\/span> address;\n    }\n\n    public <span class=\"hljs-built_in\">String<\/span> getPhoneNumber() {\n        <span class=\"hljs-keyword\">return<\/span> phoneNumber;\n    }\n\n    <span class=\"hljs-comment\">\/\/ Statische Builder-Klasse<\/span>\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Builder<\/span> <\/span>{\n        private final <span class=\"hljs-built_in\">String<\/span> firstName;\n        private final <span class=\"hljs-built_in\">String<\/span> lastName;\n        private int age;\n        private <span class=\"hljs-built_in\">String<\/span> address;\n        private <span class=\"hljs-built_in\">String<\/span> phoneNumber;\n\n        public Builder(<span class=\"hljs-built_in\">String<\/span> firstName, <span class=\"hljs-built_in\">String<\/span> lastName) {\n            <span class=\"hljs-keyword\">this<\/span>.firstName = firstName;\n            <span class=\"hljs-keyword\">this<\/span>.lastName = lastName;\n        }\n\n        public Builder age(int age) {\n            <span class=\"hljs-keyword\">this<\/span>.age = age;\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>;\n        }\n\n        public Builder address(<span class=\"hljs-built_in\">String<\/span> address) {\n            <span class=\"hljs-keyword\">this<\/span>.address = address;\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>;\n        }\n\n        public Builder phoneNumber(<span class=\"hljs-built_in\">String<\/span> phoneNumber) {\n            <span class=\"hljs-keyword\">this<\/span>.phoneNumber = phoneNumber;\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>;\n        }\n\n        public Person build() {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Person(<span class=\"hljs-keyword\">this<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h5 class=\"wp-block-heading\">2. Verwendung des Builders<\/h5>\n\n\n\n<p>Der Builder wird folgenderma\u00dfen verwendet:<\/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 = <span class=\"hljs-keyword\">new<\/span> Person.Builder(<span class=\"hljs-string\">\"John\"<\/span>, <span class=\"hljs-string\">\"Doe\"<\/span>)\n            .age(<span class=\"hljs-number\">30<\/span>)\n            .address(<span class=\"hljs-string\">\"123 Main St\"<\/span>)\n            .phoneNumber(<span class=\"hljs-string\">\"555-1234\"<\/span>)\n            .build();\n\n        System.out.println(<span class=\"hljs-string\">\"Name: \"<\/span> + person.getFirstName() + <span class=\"hljs-string\">\" \"<\/span> + person.getLastName());\n        System.out.println(<span class=\"hljs-string\">\"Alter: \"<\/span> + person.getAge());\n        System.out.println(<span class=\"hljs-string\">\"Adresse: \"<\/span> + person.getAddress());\n        System.out.println(<span class=\"hljs-string\">\"Telefon: \"<\/span> + person.getPhoneNumber());\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<p>In diesem Beispiel wird das <code>Person<\/code>-Objekt schrittweise aufgebaut. Der Builder erlaubt es, nur die notwendigen Felder anzugeben und optional weitere Parameter hinzuzuf\u00fcgen, ohne die Lesbarkeit und Wartbarkeit des Codes zu beeintr\u00e4chtigen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile des Builder-Patterns<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Klarheit und Lesbarkeit:<\/strong> Der Builder macht den Code lesbarer und verst\u00e4ndlicher, indem er eine benannte Methode f\u00fcr jeden Parameter bereitstellt.<\/li>\n\n\n\n<li><strong>Flexibilit\u00e4t:<\/strong> Der Builder erm\u00f6glicht es, nur die ben\u00f6tigten Parameter anzugeben und optionale Parameter nach Bedarf hinzuzuf\u00fcgen.<\/li>\n\n\n\n<li><strong>Unver\u00e4nderlichkeit:<\/strong> Das Builder-Pattern unterst\u00fctzt die Erstellung unver\u00e4nderlicher Objekte, da alle Felder im Konstruktor der zu erstellenden Klasse als <code>final<\/code> deklariert werden k\u00f6nnen.<\/li>\n\n\n\n<li><strong>Vermeidung von Fehlern:<\/strong> Da der Builder eine typensichere API bereitstellt, wird das Risiko von Fehlern wie der falschen Zuordnung von Parametern reduziert.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Erweiterte Nutzung des Builder-Patterns<\/h4>\n\n\n\n<p>Das Builder-Pattern kann auch erweitert werden, um noch komplexere Anforderungen zu erf\u00fcllen, wie z.B.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Validierung:<\/strong> Der Builder kann Validierungslogik enthalten, um sicherzustellen, dass nur g\u00fcltige Objekte erstellt werden.<\/li>\n\n\n\n<li><strong>Vererbung:<\/strong> Bei Verwendung von Vererbung k\u00f6nnen Builder-Klassen f\u00fcr Subklassen erweitert werden.<\/li>\n\n\n\n<li><strong>Direkte Integration:<\/strong> Einige Java-Bibliotheken und Frameworks wie Lombok bieten direkte Unterst\u00fctzung f\u00fcr das Builder-Pattern.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Beispiel f\u00fcr Validierung<\/h5>\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 <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Builder<\/span> <\/span>{\n    private final <span class=\"hljs-built_in\">String<\/span> firstName;\n    private final <span class=\"hljs-built_in\">String<\/span> lastName;\n    private int age;\n    private <span class=\"hljs-built_in\">String<\/span> address;\n    private <span class=\"hljs-built_in\">String<\/span> phoneNumber;\n\n    public Builder(<span class=\"hljs-built_in\">String<\/span> firstName, <span class=\"hljs-built_in\">String<\/span> lastName) {\n        <span class=\"hljs-keyword\">this<\/span>.firstName = firstName;\n        <span class=\"hljs-keyword\">this<\/span>.lastName = lastName;\n    }\n\n    public Builder age(int age) {\n        <span class=\"hljs-keyword\">if<\/span> (age &lt; <span class=\"hljs-number\">0<\/span>) {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException(<span class=\"hljs-string\">\"Age cannot be negative\"<\/span>);\n        }\n        <span class=\"hljs-keyword\">this<\/span>.age = age;\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>;\n    }\n\n    public Builder address(<span class=\"hljs-built_in\">String<\/span> address) {\n        <span class=\"hljs-keyword\">this<\/span>.address = address;\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>;\n    }\n\n    public Builder phoneNumber(<span class=\"hljs-built_in\">String<\/span> phoneNumber) {\n        <span class=\"hljs-keyword\">this<\/span>.phoneNumber = phoneNumber;\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>;\n    }\n\n    public Person build() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Person(<span class=\"hljs-keyword\">this<\/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\">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>Mit dieser Erweiterung wird sichergestellt, dass das Alter einer Person nicht negativ sein kann, wodurch Fehler bereits zur Compile-Zeit oder beim Erstellen des Objekts abgefangen werden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p>Das Builder-Design-Pattern bietet eine elegante und flexible M\u00f6glichkeit, komplexe Objekte in Java zu erstellen. Durch die Aufteilung der Objektkonstruktion in klar definierte Schritte verbessert es die Lesbarkeit und Wartbarkeit des Codes und reduziert die Fehleranf\u00e4lligkeit. Es ist besonders n\u00fctzlich, wenn viele optionale Parameter verwendet werden oder wenn die Erstellung eines Objekts aus mehreren Schritten besteht. Durch die Einf\u00fchrung zus\u00e4tzlicher Logik wie Validierung kann das Builder-Pattern noch leistungsf\u00e4higer und anpassungsf\u00e4higer gestaltet werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung Das Builder-Design-Pattern ist eines der bekanntesten und am h\u00e4ufigsten verwendeten Entwurfsmuster in der objektorientierten Programmierung. Es geh\u00f6rt zur Kategorie der Erzeugungsmuster (Creational Patterns) und wird verwendet, um die Konstruktion komplexer Objekte zu vereinfachen und \u00fcbersichtlicher zu gestalten. In Java kann das Builder-Pattern besonders n\u00fctzlich sein, um Objekte zu erzeugen, die viele optionale Parameter haben [&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-363","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\/363","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=363"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions"}],"predecessor-version":[{"id":364,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions\/364"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}