Was bedeutet der Begriff "kanonische Form" oder "kanonische Darstellung" in Java?

90

Ich habe oft gehört, dass dieser Begriff verwendet wird, aber ich habe ihn nie wirklich verstanden.

Was bedeutet das und kann jemand einige Beispiele nennen / mich auf einige Links verweisen?

EDIT: Vielen Dank an alle für die Antworten. Können Sie mir auch sagen, wie nützlich die kanonische Darstellung für die Leistung von equals () ist, wie in Effective Java angegeben?

Shivasubramanian A.
quelle

Antworten:

56

Wikipedia verweist auf den Begriff Kanonisierung .

Ein Prozess zum Konvertieren von Daten mit mehr als einer möglichen Darstellung in eine "standardmäßige" kanonische Darstellung. Dies kann erfolgen, um verschiedene Darstellungen auf Äquivalenz zu vergleichen, die Anzahl unterschiedlicher Datenstrukturen zu zählen, die Effizienz verschiedener Algorithmen durch Eliminieren wiederholter Berechnungen zu verbessern oder um eine aussagekräftige Sortierreihenfolge festzulegen.

Das Unicode- Beispiel war für mich am sinnvollsten:

Codierungen mit variabler Länge im Unicode-Standard, insbesondere UTF-8, haben mehr als eine mögliche Codierung für die meisten gängigen Zeichen. Dies macht die Zeichenfolgenüberprüfung komplizierter, da jede mögliche Codierung jedes Zeichenfolgenzeichens berücksichtigt werden muss. Bei einer Softwareimplementierung, bei der nicht alle Zeichencodierungen berücksichtigt werden, besteht die Gefahr, dass Zeichenfolgen akzeptiert werden, die im Anwendungsdesign als ungültig gelten, was zu Fehlern führen oder Angriffe zulassen kann. Die Lösung besteht darin, eine einzelne Codierung für jedes Zeichen zuzulassen. Bei der Kanonisierung wird dann jedes Zeichenfolgenzeichen in seine einzige zulässige Codierung übersetzt. Eine Alternative besteht darin, dass die Software ermittelt, ob eine Zeichenfolge kanonisiert ist, und sie dann ablehnt, wenn dies nicht der Fall ist. In diesem Fall liegt in einem Client / Server-Kontext die Kanonisierung in der Verantwortung des Clients.

Zusammenfassend eine Standarddarstellungsform für Daten. Von diesem Formular aus können Sie dann in eine beliebige Darstellung konvertieren, die Sie möglicherweise benötigen.

Brian Gianforcaro
quelle
64

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.

Dov Wasserman
quelle
30

Ein gutes Beispiel für das Verständnis von "kanonischer Form / Darstellung" ist die Definition des XML-Schemadatentyps von "boolean":

  • Die "lexikalische Darstellung" des Booleschen kann eine der folgenden sein: {true, false, 1, 0} während
  • Die "kanonische Darstellung" kann nur eine von sein {true, false}

Dies bedeutet im Wesentlichen, dass

  • "true"und werde "1"dem kanonischen Repräsentanten zugeordnet."true"und
  • "false"und werde "0"dem kanonischen Repräsentanten zugeordnet."false"

siehe die w3 XML - Schema - Datentypdefinition für boolean

Michael Marton
quelle
28

Das Wort "kanonisch" ist nur ein Synonym für "Standard" oder "üblich". Es hat keine Java-spezifische Bedeutung.

Dónal
quelle
3
Kanonisch hat eine reichhaltigere Bedeutung als Standard oder übliche IMO.
Tintenfisch
20

auf die einfachste und bedeutendste Form reduziert, ohne die Allgemeinheit zu verlieren

Jaime
quelle
5

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 (dh a == b). Gleichheit impliziert also Identität im Fall eines kanonischen Objekts.

Nun zum Vergleich. Sie haben jetzt die Wahl zwischen a==b oder a.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 zu a.equals(b)dem ein Anrufverfahren und erfordert mehr Overhead.

Chris Mawata
quelle
2

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.

Kimberley Coburn
quelle
0

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

SASIKALA
quelle
0

Eine kanonische Form bedeutet eine natürlich einzigartige Darstellung des Elements

Maksym Ovsianikov
quelle
0

Die Fragen des OP zur kanonischen Form und wie sie die Leistung des OP verbessern kannequals Methode können durch Erweiterung des in Effective Java bereitgestellten Beispiels beantwortet werden.

Betrachten Sie die folgende Klasse:

public final class CaseInsensitiveString {

  private final String s;

  public CaseInsensitiveString(String s) {
    this.s = Objects.requireNonNull(s);
  }

  @Override 
  public boolean equals(Object o) {
    return o instanceof CaseInsensitiveString && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
  }
}

Die equalsMethode in diesem Beispiel hat durch die Verwendung Stringder equalsIgnoreCaseMethode '' Kosten hinzugefügt . Wie im Text erwähnt

Möglicherweise möchten Sie eine kanonische Form des Feldes speichern, damit die Methode equals einen billigen exakten Vergleich kanonischer Formen anstelle eines teureren nicht standardmäßigen Vergleichs durchführen kann.

Was 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 StringFeld im CaseInsensitiveStringBeispiel auf standardmäßige Weise speichern , möglicherweise in Großbuchstaben String. Jetzt können Sie auf diese kanonische Form der CaseInsensitiveStringGroßbuchstabenvariante verweisen und kostengünstige Auswertungen in Ihren equalsund hashcodeMethoden durchführen.

Der Gilbert Arenas Dolch
quelle
0

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.

Alper t. Turker
quelle