Я считаю, что существуют два родственных применения канонических: форм и экземпляров.
A каноническая форма означает, что значения определенного типа ресурса могут быть описаны или представлены несколькими способами, и один из этих способов выбран в качестве предпочтительной канонической формы. (Эта форма канонизирована, как книги, которые превратили ее в библию, а другие формы - нет.) Классическим примером канонической формы являются пути в иерархической файловой системе, где один файл может ссылаться на число способов:
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
Классическое определение канонического представления этого файла будет последним путем. С локальными или относительными путями вы не можете глобально идентифицировать ресурс без контекстной информации. С абсолютными путями вы можете идентифицировать ресурс, но не можете определить, относятся ли два пути к одному и тому же объекту. Если два или более пути преобразуются в их канонические формы, вы можете сделать все вышеизложенное, а также определить, являются ли два ресурса одинаковыми или нет, если это важно для вашего приложения (решение проблема сглаживания).
Обратите внимание, что каноническая форма ресурса не является качеством самой конкретной формы; может быть несколько возможных канонических форм для заданного типа, например, путей к файлам (скажем, лексикографически, в первую очередь возможных абсолютных путей). Одна форма просто выбирается как каноническая форма для конкретной причины применения или может быть произвольно, чтобы все говорили на одном языке.
Принуждение объектов в их канонических экземпляров это та же самая основная идея, но вместо того, чтобы определить один «лучшее» представление ресурса, он произвольно выбирает один экземпляр класса экземпляров с тем же «содержанием», как канонические reference, затем преобразует все ссылки на эквивалентные объекты для использования одного канонического экземпляра.
Это может использоваться как метод оптимизации времени и пространства. Если в приложении есть несколько экземпляров эквивалентных объектов, то, заставляя их все решать как единственный канонический экземпляр определенного значения, вы можете исключить все, кроме одного, значения, экономя пространство и, возможно, время, так как теперь вы можете сравнить эти значения с эталонным идентификатором (==) в отличие от эквивалентности объектов (метод equals()
).
Классический пример оптимизации производительности с каноническими экземплярами - это свертывание строк с одним и тем же контентом. Вызов String.intern()
на две строки с одинаковой последовательностью символов гарантированно возвращает тот же канонический объект String для этого текста. Если вы передаете все свои строки через этот канонизатор, вы знаете, что эквивалентные строки на самом деле идентичные ссылки на объекты, то есть псевдонимы
Типы перечислений в Java 5.0+ заставляют все экземпляры определенного значения перечисления использовать один и тот же канонический экземпляр внутри VM, даже если значение сериализовано и десериализовано. Вот почему вы можете использовать if (day == Days.SUNDAY)
с безнаказанностью в java, если Days
- тип перечисления. Выполнение этого для ваших собственных занятий, безусловно, возможно, но заботится. Прочитайте Эффективная Java от Джоша Блоха за подробностями и советами.
канонических имеет более богатый смысл, чем стандартные или обычный ИМО. – squid 2015-11-12 15:20:47