Creo que hay dos usos relacionados de canonical: formas e instancias.
A forma canónica significa que los valores de un tipo particular de recurso se pueden describir o representar de múltiples maneras, y una de esas formas se elige como la forma canónica preferida. (Ese formulario es canonizado, como los libros que lo hicieron en la Biblia, y las otras formas no). Un ejemplo clásico de una forma canónica son las rutas en un sistema de archivos jerárquico, donde se puede hacer referencia a un solo archivo en un número de formas:
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 definición clásica de la representación canónica de ese archivo sería la última ruta. Con rutas locales o relativas, no puede identificar globalmente el recurso sin información contextual. Con rutas absolutas puede identificar el recurso, pero no puede decir si dos rutas se refieren a la misma entidad. Con dos o más rutas convertidas a sus formularios canónicos, puede hacer todo lo anterior, además de determinar si dos recursos son iguales o no, si eso es importante para su aplicación (resuelva el problema de alias).
Tenga en cuenta que la forma canónica de un recurso no es una calidad de esa forma en particular; puede haber múltiples formas canónicas posibles para un tipo dado, como las rutas de archivos (por ejemplo, lexicográficamente, en primer lugar, las rutas absolutas posibles). Se ha seleccionado un solo formulario como la forma canónica para un motivo de aplicación particular, o quizás arbitrariamente para que todos hablen el mismo idioma.
Forzar a los objetos en las casos canónicos es la misma idea básica, pero en lugar de determinar una "mejor" representación de un recurso, que determina arbitrariamente a una instancia de una clase de casos con el mismo "contenido" como el canónico referencia, luego convierte todas las referencias a objetos equivalentes para usar una instancia canónica.
Esto se puede utilizar como una técnica para optimizar el tiempo y el espacio. Si hay varias instancias de objetos equivalentes en una aplicación, al forzarlos a resolverlos como la única instancia canónica de un valor particular, puede eliminar todos los valores, excepto uno, ahorrando espacio y posiblemente tiempo, ya que ahora puede comparar aquellos valores con identidad de referencia (==) en oposición a la equivalencia de objeto (método equals()
).
Un ejemplo clásico de optimización del rendimiento con instancias canónicas es el colapso de cadenas con el mismo contenido. Llamar al String.intern()
en dos cadenas con la misma secuencia de caracteres garantiza devolver el mismo objeto Cadena canónico para ese texto. Si pasa todas las cadenas a través de ese canonicalizador, sabe que las cadenas equivalentes son en realidad referencias de objeto idénticas, es decir, alias
Los tipos enumerados en Java 5.0+ fuerzan a todas las instancias de un valor enum particular a usar la misma instancia canónica dentro de un VM, incluso si el valor se serializa y se deserializa. Es por eso que puede usar if (day == Days.SUNDAY)
con impunidad en java si Days
es un tipo de enumeración. Hacer esto para sus propias clases es ciertamente posible, pero se cuida. Lea Java efectivo por Josh Bloch para obtener detalles y consejos.
canónico tiene un significado más rico que el estándar o habitual de la OMI. – squid