2013-03-08 6 views
9

Von diesen Artima article on clone vs copy constructor:Was meint Joshua Bloch mit extra-linguistisch?

Klon-Methode des Objekts ist sehr schwierig. Es basiert auf Feldkopien und es ist "extra-linguistic." Es erstellt ein Objekt, ohne einen Konstruktor aufzurufen. Es gibt keine Garantien, dass die von den Konstruktoren festgelegten Invarianten beibehalten werden. Es gab viele Bugs über die Jahre, sowohl innerhalb als auch außerhalb der Sonne, aus der Tatsache, dass wenn Sie rufen Sie einfach super.clone wiederholt die Kette, bis Sie ein Objekt geklont haben, haben Sie eine flache Kopie des Objekts .

Was bedeutet Joshua Bloch mit extra-linguistisch?

+1

I Klonen Ich nehme an, dass er meint, dass es außerhalb der Regeln liegt, die normalerweise in der Java-Sprache für die Objektinstanziierung festgelegt werden - id est , den Konstruktor des Objekts aufrufen. – jrajav

+0

@Geek +1, Sie fragen Lotta interessante Fragen aus dem Buch 'Effektive Java von Joushua Bloch', vor allem Fragen zu Generika .. :) – PermGenError

+0

@PermGenError Ich hoffe, die Fragen, die ich gefragt habe, würde anderen auch helfen. Stackoverflow ist einfach großartig. – Geek

Antwort

9

Er meint etwas wie "außerhalb des Umfangs von Java".

Speziell in Java ist die "richtige" Möglichkeit, ein neues Objekt zu erstellen, die Verwendung des Object-Konstruktors. Viele Klassenschreiber verlassen sich auf diese Annahme und Codelogik in ihre Konstruktoren - Dinge wie die Validierung von Eingaben oder alles andere, was Sie zur Zeit der Konstruktion garantieren wollen - das nennt er "von den Konstruktoren festgelegte Invarianten". Das Klonen umgeht jedoch diese grundlegende Einschränkung und erstellt eine Speicherkopie, ohne den Konstruktor aufzurufen - daher ist es "extra linguistisch".

Technisch ist Serialisierung auch.

+0

Was ist ein gültiger Anwendungsfall für den Objektklon? – Pacerier

+0

@Pacerier - innerhalb Ihres eigenen Projekts, wo Sie die volle Kontrolle über das Code-Klonen haben, ist 100% gültig, obwohl einige Kopier-Konstruktoren bevorzugen würden. es wird nur dann zum Problem, wenn Sie nicht mehr den gesamten Code kontrollieren und möglicherweise auf andere Annahmen stoßen, die von anderen Entwicklern gemacht wurden - wie wenn Sie eine Bibliothek schreiben. – radai

0

Wahrscheinlich die Tatsache, dass es nicht in Java implementiert ist, aber es hat eine native in der Object-Klasse.

+0

Dies ist wahrscheinlich nicht, was er angesichts des Zusammenhangs meinte. – jrajav

0

Die außersprachlichen Objekterstellung Mechanismen (dh andere als Aufruf oder Verkettungsbauer) sind:

  1. Serialisierung
  2. Reflexion
  3. btye-Code-Generierung