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.