112 votes

Que signifie le terme "forme canonique" ou "représentation canonique" en Java veux dire?

J'ai souvent entendu ce terme, mais je n'ai jamais vraiment compris.

Ce qui signifie-t-il, et n'importe qui peut donner quelques exemples/m'indiquer quelques liens?

EDIT: Merci à tous pour les réponses. Pouvez-vous également me dire comment la représentation canonique est utile dans la equals() de la performance, comme indiqué dans l'efficacité de Java?

71voto

Dov Wasserman Points 1538

Je crois qu'il y a deux utilisations liées à la canoniques: les formes et les instances.

Une forme canonique signifie que les valeurs d'un type particulier de ressource peut être décrit ou représenté de plusieurs façons, et un de ces moyens est choisie comme la meilleure forme canonique. (Cette formule est canonisé, comme les livres que dans la bible, et les autres formes ne sont pas.) Un exemple classique d'une forme canonique est des chemins d'accès dans un système de fichiers hiérarchique, où un seul fichier peut être mentionnée dans un certain nombre de façons:

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

La définition classique de la représentation canonique de ce fichier serait le dernier chemin. Avec les collectivités locales ou les chemins d'accès relatifs vous ne pouvez pas identifier globalement la ressource sans l'information contextuelle. Avec des chemins absolus, vous pouvez identifier la ressource, mais ne peut pas dire si deux chemins se réfèrent à la même entité. Avec deux ou plusieurs chemins converti à leurs formes canoniques, vous pouvez le faire tous les ci-dessus, en plus de déterminer si les deux ressources sont les mêmes ou pas, si c'est important pour votre application (résoudre le problème d'aliasing).

Notez que la forme canonique d'une ressource n'est pas une qualité de cette forme particulière lui-même; il peut y avoir plusieurs formes canoniques pour un type donné comme chemins d'accès de fichier (par exemple, lexicographiquement tout d'abord possible de chemins absolus). Une forme est sélectionnée comme la forme canonique d'une application particulière de la raison, ou peut-être de manière arbitraire, de sorte que tout le monde parle la même langue.

Forcer les objets dans leurs instances canoniques est la même idée de base, mais au lieu de déterminer un "meilleur" de la représentation d'une ressource, il choisit arbitrairement une instance d'une classe d'occurrences avec le même "contenu" comme canoniques de référence, puis convertit toutes les références à l'équivalent d'objets à utiliser un exemple canonique.

Il peut être utilisé comme une technique pour optimiser l'espace et le temps. S'il existe plusieurs instances de l'équivalent des objets dans une application, puis en les forçant tous à être résolus, comme le seul exemple canonique d'une valeur particulière, vous pouvez éliminer tous, mais un de chaque valeur, en économisant de l'espace et, éventuellement, de temps puisque vous pouvez maintenant comparer ces valeurs de référence de l'identité ( = = ), par opposition à l'objet de l'équivalence (equals() méthode).

Un exemple classique de l'optimisation de la performance avec canonique cas, c'est l'effondrement des chaînes de caractères avec le même contenu. Appelant String.intern() sur les deux chaînes de caractères avec la même séquence de caractères est garanti pour le retour des mêmes canonique de la Chaîne de l'objet de ce texte. Si vous passer tous vos chaînes à travers cette canonicalizer, vous savez équivalent chaînes sont identiques références de l'objet, c'est à dire, alias

Les types enum dans Java 5.0+ force de toutes les instances d'une valeur d'énumération d'utiliser le même canonique instance dans une machine virtuelle, même si la valeur est sérialisé et désérialisé. C'est pourquoi vous pouvez utiliser if (day == Days.SUNDAY) avec l'impunité en java si Days est un type enum. De le faire pour votre propre classes est certainement possible, mais prend soin. Lire Efficace Java par Josh Bloch pour plus de détails et de conseils.

65voto

Brian Gianforcaro Points 11985

Wikipédia points au terme de mise en forme Canonique.

Un processus de conversion de données qui a plus d'une représentation possible dans un "standard" de la représentation canonique. Cela peut être fait à comparer les différentes représentations de l'équivalence, à compter le nombre de différentes structures de données, afin d'améliorer l'efficacité de différents algorithmes en éliminant les calculs qui se répètent, ou à faire-il possible d'imposer un sens de tri.

L' Unicode exemple fait le plus de sens pour moi:

De longueur Variable des codages dans le standard Unicode, en particulier en UTF-8, plus d'un encodage possible pour la plupart des caractères communs. Cela rend la chaîne de validation plus compliqué, car tous les possible de codage de chaque chaîne de caractères doivent être examinés. Une mise en œuvre de logiciels qui ne considère pas tous les codages de caractères court le risque de l'acceptation des chaînes considéré comme non valide dans la conception de l'application, ce qui pourrait provoquer des bugs ou permettent des attaques. La solution est de permettre à un codage unique pour chaque caractère. Mise en forme canonique est alors le processus de la traduction de chaque chaîne de caractères à un seul permis de codage. Une alternative est pour logiciel pour déterminer si une chaîne est standardisée, et ensuite la rejeter si elle ne l'est pas. Dans ce cas, un client/serveur de contexte, la mise en forme canonique serait de la responsabilité du client.

En résumé, un formulaire standard de représentation des données. À partir de ce formulaire, vous pouvez convertir n'importe quelle représentation vous pourriez avoir besoin.

37voto

Michael Marton Points 71

Un bon exemple pour comprendre la "forme canonique/représentation", c'est de regarder le schéma XML de type de données de la définition de "boolean":

  • la "représentation lexicale" de booléenne peut être: {true, false, 1, 0} alors que
  • la "représentation canonique" ne peut être que celui de l' {true, false}

Ce en essence, signifie que

  • "true" et "1" obtenir mappé à l'canonique repr. "true" et
  • "false" et "0" répertoriées pour le canoncial repr. "false"

voir le w3c XML schema type de données définition type boolean

32voto

Dónal Points 61837

Le mot "canonique" est juste un synonyme de "standard" ou "habituel". Il n'a pas de Java-sens spécifique.

22voto

Jaime Points 21

réduit à la plus simple et la plus importante forme sans perdre de généralité

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X