Ich glaube, es gibt zwei verwandte Verwendungen von kanonisch: Formen und Instanzen.
Eine kanonische Form bedeutet, dass Werte eines bestimmten Ressourcentyps auf verschiedene Arten beschrieben oder dargestellt werden können, und eine dieser Möglichkeiten wird als bevorzugte kanonische Form gewählt. (Diese Form ist kanonisiert , wie Bücher, die es in die Bibel geschafft haben, und die anderen Formen nicht.) Ein klassisches Beispiel für eine kanonische Form sind Pfade in einem hierarchischen Dateisystem, in dem auf eine einzelne Datei auf verschiedene Arten verwiesen werden kann ::
myFile.txt # in current working dir
../conf/myFile.txt # relative to the CWD
/apps/tomcat/conf/myFile.txt # absolute path using symbolic links
/u1/local/apps/tomcat-5.5.1/conf/myFile.txt # absolute path with no symlinks
Die klassische Definition der kanonischen Darstellung dieser Datei wäre der letzte Pfad. Mit lokalen oder relativen Pfaden können Sie die Ressource ohne Kontextinformationen nicht global identifizieren. Mit absoluten Pfaden können Sie die Ressource identifizieren, aber nicht erkennen, ob sich zwei Pfade auf dieselbe Entität beziehen. Mit zwei oder mehr Pfaden, die in ihre kanonischen Formen konvertiert wurden, können Sie alle oben genannten Schritte ausführen und feststellen, ob zwei Ressourcen gleich sind oder nicht, ob dies für Ihre Anwendung wichtig ist (lösen Sie das Aliasing-Problem ).
Beachten Sie, dass die kanonische Form einer Ressource keine Qualität dieser bestimmten Form selbst ist. Es kann mehrere mögliche kanonische Formen für einen bestimmten Typ geben, wie z. B. Dateipfade (z. B. lexikografisch zuallererst mögliche absolute Pfade). Ein Formular wird nur als kanonisches Formular aus einem bestimmten Anwendungsgrund oder willkürlich ausgewählt, sodass jeder dieselbe Sprache spricht.
Objekte in ihre kanonischen Instanzen zwingen ist dieselbe Grundidee, aber anstatt eine "beste" Darstellung einer Ressource zu bestimmen, wählt es willkürlich eine Instanz einer Instanzklasse mit demselben "Inhalt" wie die kanonische Referenz aus und konvertiert dann alle Referenzen zu äquivalenten Objekten, um die eine kanonische Instanz zu verwenden.
Dies kann als Technik zur Optimierung von Zeit und Raum verwendet werden. Wenn eine Anwendung mehrere Instanzen äquivalenter Objekte enthält, können Sie durch Erzwingen, dass alle als einzelne kanonische Instanz eines bestimmten Werts aufgelöst werden, alle bis auf einen Wert eliminieren. Dies spart Platz und möglicherweise Zeit, da Sie jetzt vergleichen können diese Werte mit Referenzidentität (==) im Gegensatz zur Objektäquivalenz ( equals()
Methode).
Ein klassisches Beispiel für die Optimierung der Leistung mit kanonischen Instanzen ist das Reduzieren von Zeichenfolgen mit demselben Inhalt. Wenn Sie String.intern()
zwei Zeichenfolgen mit derselben Zeichenfolge aufrufen, wird garantiert dasselbe kanonische Zeichenfolgenobjekt für diesen Text zurückgegeben. Wenn Sie alle Ihre Zeichenfolgen durch diesen Canonicalizer übergeben, wissen Sie, dass äquivalente Zeichenfolgen tatsächlich identische Objektreferenzen sind, dh Aliase
Die Aufzählungstypen in Java 5.0+ erzwingen, dass alle Instanzen eines bestimmten Aufzählungswerts dieselbe kanonische Instanz innerhalb einer VM verwenden, selbst wenn der Wert serialisiert und deserialisiert ist. Aus diesem Grund können Sie if (day == Days.SUNDAY)
in Java ungestraft verwenden, wenn Days
es sich um einen Aufzählungstyp handelt. Dies für den eigenen Unterricht zu tun ist sicherlich möglich, passt aber auf. Lesen Sie Effective Java von Josh Bloch für Details und Ratschläge.
auf die einfachste und bedeutendste Form reduziert, ohne die Allgemeinheit zu verlieren
quelle
Eine einfache Möglichkeit, sich daran zu erinnern, ist die Art und Weise, wie "kanonisch" in theologischen Kreisen verwendet wird. Die kanonische Wahrheit ist die wahre Wahrheit. Wenn also zwei Menschen sie finden, haben sie dieselbe Wahrheit gefunden. Gleiches gilt für die kanonische Instanz. Wenn Sie denken, Sie haben zwei von ihnen gefunden (dh
a.equals(b)
), haben Sie wirklich nur eine (dha == b
). Gleichheit impliziert also Identität im Fall eines kanonischen Objekts.Nun zum Vergleich. Sie haben jetzt die Wahl zwischen
a==b
odera.equals(b)
, da sie im Fall einer kanonischen Instanz dieselbe Antwort liefern, aber a == b ein Vergleich der Referenz ist (die JVM kann zwei Zahlen extrem schnell vergleichen, da es sich nur um zwei verglichene 32-Bit-Muster handelt zua.equals(b)
dem ein Anrufverfahren und erfordert mehr Overhead.quelle
Ein weiteres gutes Beispiel könnte sein: Sie haben eine Klasse, die die Verwendung von kartesischen (x, y, z), sphärischen (r, Theta, phi) und zylindrischen Koordinaten (r, phi, z) unterstützt. Um die Gleichheit herzustellen (Gleichheitsmethode), möchten Sie wahrscheinlich alle Darstellungen in eine "kanonische" Darstellung Ihrer Wahl konvertieren, z. B. sphärische Koordinaten. (Oder vielleicht möchten Sie dies im Allgemeinen tun - dh eine interne Darstellung verwenden.) Ich bin kein Experte, aber dies ist mir als ein gutes konkretes Beispiel eingefallen.
quelle
Kanonische Darstellung bedeutet, das Zeichen in einem anderen Stil anzuzeigen. Wenn ich beispielsweise einen Buchstaben A schreibe, bedeutet dies, dass eine andere Person den Buchstaben A in einem anderen Stil schreiben kann :)
Dies entspricht dem OPTICAL CHARACTER RECOGNITION FIELD
quelle
Eine kanonische Form bedeutet eine natürlich einzigartige Darstellung des Elements
quelle
Die Fragen des OP zur kanonischen Form und wie sie die Leistung des OP verbessern kann
equals
Methode können durch Erweiterung des in Effective Java bereitgestellten Beispiels beantwortet werden.Betrachten Sie die folgende Klasse:
Die
equals
Methode in diesem Beispiel hat durch die VerwendungString
derequalsIgnoreCase
Methode '' Kosten hinzugefügt . Wie im Text erwähntWas bedeutet Joshua Bloch, wenn er kanonische Form sagt ? Nun, ich denke, Dónals prägnante Antwort ist sehr angemessen. Wir können das zugrunde liegende
String
Feld imCaseInsensitiveString
Beispiel auf standardmäßige Weise speichern , möglicherweise in GroßbuchstabenString
. Jetzt können Sie auf diese kanonische Form derCaseInsensitiveString
Großbuchstabenvariante verweisen und kostengünstige Auswertungen in Ihrenequals
undhashcode
Methoden durchführen.quelle
Kanonische Daten in RDBMS, Grafikdaten;
Stellen Sie sich "Normalisierung" oder "Normalform" von Daten in einem RDBMS vor. Dieselben Daten sind in verschiedenen Tabellen vorhanden, werden mit einer eindeutigen Kennung dargestellt und in verschiedenen Tabellen zugeordnet.
oder
Denken Sie an eine einzelne Form von Daten in der Graphendatenbank, die in vielen Dreiergruppen dargestellt werden.
Der Hauptvorteil besteht darin, Dml (Datenmanipulation) effizienter zu gestalten, da Sie nur einen Wert anstelle vieler Werte einfügen (einfügen / aktualisieren) können.
quelle