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 Dayses 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.