{"id":4328,"date":"2019-02-10T14:54:10","date_gmt":"2019-02-10T12:54:10","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4328"},"modified":"2019-10-14T00:29:06","modified_gmt":"2019-10-13T22:29:06","slug":"immutable-objekte-und-wither-methoden","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2019\/02\/immutable-objekte-und-wither-methoden\/","title":{"rendered":"Immutable-Objekte und Wither-Methoden"},"content":{"rendered":"<p>Objekte, dessen Zust\u00e4nde nicht ver\u00e4ndert werden k\u00f6nnen, hei\u00dfen immutable. Die Klassen deklarieren in so einem Fall keine \u00f6ffentlichen Variablen und auch keine Methoden mit Seiteneffekten, die diese Zust\u00e4nde modifizieren k\u00f6nnten. Setter gibt es folglich nicht, nur vielleicht Getter.<\/p>\n<p>Damit die Objekte ihre Werte bekommen, gibt es unterschiedliche Wege \u2013 parametrisierte Konstruktoren sind ein guter Weg. Die Belegungen lassen sich beim Konstruktoraufruf \u00fcbergeben und so sehr gut direkt in finale Variablen schreiben. In der Java-Bibliothek gibt es eine Reihe solcher Klassen, die keinen parameterlosen Konstruktor besitzen, und nur einige parametrisierte, die Werte erwarten. Die im Konstruktor \u00fcbergebenen Werte initialisieren das Objekt, und es beh\u00e4lt diese Werte sein ganzes Leben lang. Zu den Klassen geh\u00f6ren zum Beispiel Integer, Double, Color, File oder Font.<\/p>\n<p>Immutable-Objekte, die auch die equals(\u2026)-Methode implementieren hei\u00dfen Werteobjekt\u00a0(engl. value object).<\/p>\n<h4>Wither-Methoden<\/h4>\n<p>Auch wenn sich Objekte mit Setten nicht \u00e4ndern lassen, so soll es doch m\u00f6glich sein, neue Objekte mit ver\u00e4nderten Zust\u00e4nden zu erschaffen. Ein Blick auf die Klasse String zeigt zum Beispiel trim() und toUpperCase() \u2013 das Ergebnis sind neue Strings.<\/p>\n<p>Um allgemein Zustandsvariablen zu ver\u00e4ndern k\u00f6nnen Wither-Methoden\u00a0verwendet werden; sie sind \u00e4hnlich wie Setter, nur ver\u00e4ndern sie keinen Zustand am aktuellen Objekt, sondern f\u00fchren zu einem neuen Objekt mit dem ge\u00e4nderten Zustand.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"108\">Getter<\/td>\n<td width=\"166\">Setter<\/td>\n<td width=\"230\">Wither<\/td>\n<\/tr>\n<tr>\n<td width=\"108\"><em>Typ<\/em> getXXX()<\/td>\n<td width=\"166\">void setXXX(<em>Typ<\/em> xxx)<\/td>\n<td width=\"230\"><em>ImmutableTyp<\/em> withXXX(<em>Typ<\/em> xxx)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Namenskonvention der Getter, Setter, Wither f\u00fcr eine Property xxx<\/p>\n<p>Dazu ein Beispiel. Ein Raum hat einen Namen und eine Gr\u00f6\u00dfe. Die Exemplare sollen unver\u00e4nderbar sein:<\/p>\n<pre>class Room {\r\n\r\n\u00a0 private final String name;\r\n\r\n\u00a0 private final int size;\r\n\r\n\r\n\r\n\r\n\u00a0 public Room( String name, int size ) {\r\n\r\n\u00a0\u00a0\u00a0 this.name = name;\r\n\r\n\u00a0\u00a0\u00a0 this.size = size;\r\n\r\n\u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 public String getName() {\r\n\r\n\u00a0\u00a0\u00a0 return name;\r\n\r\n\u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 public int getSize() {\r\n\r\n\u00a0\u00a0\u00a0 return size;\r\n\r\n\u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 public <strong>Room withName<\/strong>( String name ) {\r\n\r\n\u00a0\u00a0\u00a0 return new Room( name, size );\r\n\r\n\u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 public <strong>Room withSize<\/strong>( int size ) {\r\n\r\n\u00a0\u00a0\u00a0 return new Room( name, size );\r\n\r\n\u00a0\u00a0}\r\n\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Objekte, dessen Zust\u00e4nde nicht ver\u00e4ndert werden k\u00f6nnen, hei\u00dfen immutable. Die Klassen deklarieren in so einem Fall keine \u00f6ffentlichen Variablen und auch keine Methoden mit Seiteneffekten, die diese Zust\u00e4nde modifizieren k\u00f6nnten. Setter gibt es folglich nicht, nur vielleicht Getter. Damit die Objekte ihre Werte bekommen, gibt es unterschiedliche Wege \u2013 parametrisierte Konstruktoren sind ein guter Weg. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false,"_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-4328","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4328"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4328\/revisions"}],"predecessor-version":[{"id":4429,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4328\/revisions\/4429"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}