Solución:
Creo que hay dos usos relacionados de canónico: 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 formas, y una de esas formas se elige como la forma canónica preferida. (Esa forma es canonizado, como los libros que llegaron a 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 de varias maneras:
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 saber si dos rutas se refieren a la misma entidad. Con dos o más rutas convertidas a sus formas canónicas, puede hacer todo lo anterior, además de determinar si dos recursos son iguales o no, si eso es importante para su aplicación (resolver el problema del aliasing).
Tenga en cuenta que la forma canónica de un recurso no es una cualidad de esa forma particular en sí; puede haber múltiples formas canónicas posibles para un tipo dado, como rutas de archivo (digamos, lexicográficamente en primer lugar de todas las posibles rutas absolutas). Una forma simplemente se selecciona como forma canónica por un motivo de aplicación en particular, o tal vez de forma arbitraria para que todos hablen el mismo idioma.
Forzar objetos en su instancias canónicas es la misma idea básica, pero en lugar de determinar una “mejor” representación de un recurso, elige arbitrariamente una instancia de una clase de instancias con el mismo “contenido” que la referencia canónica, luego convierte todas las referencias a objetos equivalentes para usar el una instancia canónica.
Esto se puede utilizar como una técnica para optimizar tanto el tiempo como el espacio. Si hay varias instancias de objetos equivalentes en una aplicación, al forzarlos a que se resuelvan todos como la instancia canónica única de un valor en particular, puede eliminar todos menos uno de cada valor, ahorrando espacio y posiblemente tiempo, ya que ahora puede comparar aquellos valores con identidad de referencia (==) en contraposición a la equivalencia de objeto (equals()
método).
Un ejemplo clásico de optimización del rendimiento con instancias canónicas es contraer cadenas con el mismo contenido. Vocación String.intern()
en dos cadenas con la misma secuencia de caracteres se garantiza que devuelve el mismo objeto de cadena canónico para ese texto. Si pasa todas sus cadenas a través de ese canonicalizador, sabrá que las cadenas equivalentes son en realidad referencias de objetos idénticas, es decir, alias
Los tipos de enumeración en Java 5.0+ obligan a todas las instancias de un valor de enumeración particular a usar la misma instancia canónica dentro de una máquina virtual, incluso si el valor está serializado y deserializado. Por eso puedes 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 hay que tener cuidado. Leer Java eficaz por Josh Bloch para obtener detalles y consejos.
Wikipedia apunta al término Canonicalización.
Un proceso para convertir datos que tienen más de una representación posible en una representación canónica “estándar”. Esto se puede hacer para comparar diferentes representaciones para la equivalencia, contar el número de estructuras de datos distintas, mejorar la eficiencia de varios algoritmos al eliminar cálculos repetidos o hacer posible imponer un orden de clasificación significativo.
los Unicode El ejemplo tuvo más sentido para mí:
Las codificaciones de longitud variable en el estándar Unicode, en particular UTF-8, tienen más de una codificación posible para la mayoría de los caracteres comunes. Esto hace que la validación de cadenas sea más complicada, ya que se deben considerar todas las posibles codificaciones de cada carácter de cadena. Una implementación de software que no considere todas las codificaciones de caracteres corre el riesgo de aceptar cadenas consideradas inválidas en el diseño de la aplicación, lo que podría causar errores o permitir ataques. La solución es permitir una única codificación para cada carácter. La canonicalización es entonces el proceso de traducir cada carácter de cadena a su codificación única permitida. Una alternativa es que el software determine si una cadena está canonicalizada y luego la rechace si no lo está. En este caso, en un contexto cliente / servidor, la canonicalización sería responsabilidad del cliente.
En resumen, una forma estándar de representación de datos. Desde este formulario, puede convertirlo a cualquier representación que necesite.
Un buen ejemplo para entender la “forma / representación canónica” es mirar la definición de tipo de datos del esquema XML de “booleano”:
- la “representación léxica” de boolean puede ser una de las siguientes:
{true, false, 1, 0}
mientras que - la “representación canónica” sólo puede ser una de
{true, false}
Esto, en esencia, significa que
-
"true"
y"1"
mapear a la repr. canónica."true"
y -
"false"
y"0"
mapear a la repr. canoncial."false"
consulte la definición de tipo de datos del esquema XML w3 para booleano