{"id":16,"date":"2006-07-16T10:14:00","date_gmt":"2006-07-16T10:14:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=16"},"modified":"2006-07-16T10:14:00","modified_gmt":"2006-07-16T10:14:00","slug":"das-oberste-stack-element-duplizieren","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2006\/07\/das-oberste-stack-element-duplizieren\/","title":{"rendered":"Das oberste Stack-Element duplizieren"},"content":{"rendered":"<p><i>Die Klasse Stack besitzt zwar die Basisfunktionalit\u00e4t, die ein Stapel  besitzen sollte, aber auch nicht mehr. Hin und wieder w\u00fcnschen wir uns aber eine  Funktion, die das oberste Stack-Element dupliziert, kurz dup().<\/i><\/p>\n<p>Bei der Implementierung treten allerdings zwei Fragen auf, mit denen zwei  v\u00f6llig unterschiedliche L\u00f6sungsans\u00e4tze verbunden sind. Da die Klasse Stack wie  die anderen Datenstrukturen auf Objekte ausgelegt ist, m\u00fcssen wir uns dar\u00fcber  Klarheit verschaffen, wie das obere Objekt dupliziert werden soll. Soll eine  Kopie der Objekt-Referenz neu auf den Stapel gelegt werden oder etwa das gesamte  Objekt geklont werden?<\/p>\n<p><b>Die einfache L\u00f6sung<\/b><\/p>\n<p>Die einfachste L\u00f6sung besteht darin, das oberste Objekt einfach mittels der  schon vorhandenen Stack-Methoden push() und peek() draufzulegen. Nehmen wir an,  wir haben eine Unterklasse DupStack, dann sieht die erste Variante zum Clonen so  aus:<\/p>\n<pre>void dup() \/* throws EmptyStackException *\/<br \/>{<br \/> push( peek() );<br \/>}<\/pre>\n<p>peek() gibt aber lediglich eine Referenz auf das Objekt zur\u00fcck. Und das  anschlie\u00dfende push() speichert diese Referenz dann auf dem Stapel. Nehmen wir  an, wir haben zwei StringBuffer-Objekte auf dem Stapel. Wenn wir nun dup()  aufrufen und den String \u00e4ndern, der oben auf dem Stapel liegt, so \u00e4ndern wir  automatisch das zweite Element gleich mit. Dies ist aber nicht unbedingt  beabsichtigt, und wir m\u00fcssen uns Gedanken \u00fcber eine alternative L\u00f6sung machen.  Wir sehen, dass dup() in der Klasse Stack fehlt, weil seine Implementierung  davon abh\u00e4ngt, ob eine Referenz- oder eine Wertsemantik f\u00fcr Kellerelemente  gew\u00fcnscht ist.<\/p>\n<p><b>Die kompliziertere L\u00f6sung mit Klonen<\/b><\/p>\n<p>Um das oberste Stack-Element zu kopieren, bietet sich die clone()-Methode von  Object an. All die Objekte, die sich klonen lassen, und das sind l\u00e4ngst nicht  alle, implementieren das Interface Cloneable. Nun lie\u00dfe sich einfach folgern:  Wenn das zu duplizierende Objekt ein Exemplar von Cloneable ist, dann k\u00f6nnen wir  einfach die clone()-Methoden aufrufen und das zur\u00fcckgegebene Objekt mittels  push() auf den Stapel bringen.<\/p>\n<pre>void dup2() throws CloneNotSupportedException<br \/>{<br \/> try<br \/> {<br \/>   Object top = peek();<br \/><br \/>   if ( top instanceof Cloneable )<br \/>     push( top.clone() );<br \/><br \/> }<br \/> catch ( EmptyStackException e ) { }<br \/>}<\/pre>\n<p>Beziehungsweise<\/p>\n<pre>void dup3() throws CloneNotSupportedException \/*, EmptyStackException *\/<br \/>{<br \/> push( peek().clone() );<br \/>}<\/pre>\n<p>Dies funktioniert f\u00fcr die meisten Objekte, allerdings nicht f\u00fcr Objekte der  Klasse Object. Denn clone() der Klasse Object ist protected &#8211; wir d\u00fcrfen also  von au\u00dfen nicht dran, nur eine Unterklasse und die Klasse selbst. Hier haben wir  also zwei Probleme.<\/p>\n<ul>\n<li>Leider l\u00e4sst sich nur mit Aufwand \u00fcberpr\u00fcfen, ob das Objekt auf dem Stapel    auch wirklich ein pures Object ist, denn alle Objekte sind instanceof Object.    Gl\u00fccklicherweise gibt es kaum eine Anwendung, wo reine Object-Elemente    gesichert werden m\u00fcssen.<\/li>\n<li>Was machen wir mit Objekten, die nicht klonbar sind? Leider gibt es f\u00fcr    diese Frage keine direkte Antwort. Eine universelle Stack-Klasse mit einer    uneingeschr\u00e4nkten dup()-Methode gibt es nicht. Wir m\u00fcssen als Stack-Benutzer    festlegen, dass das oberste Element Clonable ist, um zumindest eine eigene    Implementierung nutzen zu k\u00f6nnen. Oder wir bleiben dabei, bei nicht klonbaren    Objekten doch nur die Referenz zu duplizieren. Das w\u00e4re zumindest f\u00fcr    eineindeutige Objekte mit Wertsemantik die ideale L\u00f6sung.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Die Klasse Stack besitzt zwar die Basisfunktionalit\u00e4t, die ein Stapel besitzen sollte, aber auch nicht mehr. Hin und wieder w\u00fcnschen wir uns aber eine Funktion, die das oberste Stack-Element dupliziert, kurz dup(). Bei der Implementierung treten allerdings zwei Fragen auf, mit denen zwei v\u00f6llig unterschiedliche L\u00f6sungsans\u00e4tze verbunden sind. Da die Klasse Stack wie die anderen [&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":[1],"tags":[],"class_list":["post-16","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/16","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=16"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/16\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}