Я вважаю, що канонічне використання пов’язане між собою двома способами: форми та екземпляри.
А канонічна форма , означає , що значення певного типу ресурсу можуть бути описані або представлені кілька способами, і один з цих способів вибираються в якості сприяння канонічної форми. (Ця форма канонізована , як книги, що потрапили до Біблії, а інші форми - ні.) Класичним прикладом канонічної форми є шляхи в ієрархічній файловій системі, де на один файл можна посилатися різними способами. :
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
Класичне визначення канонічного подання цього файлу було б останнім шляхом. За допомогою локальних або відносних шляхів ви не можете глобально ідентифікувати ресурс без контекстної інформації. За абсолютними шляхами ви можете ідентифікувати ресурс, але не можете сказати, чи два шляхи посилаються на одну й ту саму сутність. За допомогою двох або більше шляхів, перетворених у їхні канонічні форми, ви можете зробити все вищезазначене, плюс визначити, однакові два ресурси чи ні, якщо це важливо для вашої програми (вирішити проблему псевдонімів ).
Зверніть увагу, що канонічна форма ресурсу не є якістю саме цієї форми; для даного типу може бути декілька можливих канонічних форм, таких як шляхи до файлів (скажімо, лексикографічно насамперед можливі абсолютні шляхи). Одна форма просто вибрана як канонічна форма з певної причини застосування, або, можливо, довільно, щоб усі говорили однією мовою.
Примушування об’єктів до їх канонічних екземплярів - це та сама основна ідея, але замість того, щоб визначити одне «найкраще» подання ресурсу, воно довільно вибирає один екземпляр класу екземплярів із тим самим «вмістом», що і канонічне посилання, а потім перетворює всі посилання до еквівалентних об'єктів використовувати один канонічний екземпляр.
Це можна використовувати як техніку для оптимізації як часу, так і простору. Якщо в програмі є кілька екземплярів еквівалентних об’єктів, то, примушуючи їх усі вирішуватись як єдиний канонічний екземпляр певного значення, ви можете усунути кожне значення, крім одного, заощаджуючи простір і, можливо, час, оскільки тепер ви можете порівнювати ці значення з посилальною ідентичністю (==) на відміну від еквівалентності об’єкта ( equals()метод).
Класичним прикладом оптимізації продуктивності канонічних екземплярів є згортання рядків з однаковим вмістом. Виклик String.intern()двох рядків з однаковою послідовністю символів гарантовано поверне той самий канонічний об’єкт String для цього тексту. Якщо ви пропускаєте всі свої рядки через цей канонізатор, ви знаєте, що еквівалентні рядки насправді є однаковими посиланнями на об'єкти, тобто псевдонімами
Типи перечислення в Java 5.0+ змушують усі екземпляри певного значення перечислення використовувати один і той же канонічний екземпляр у віртуальній машині, навіть якщо значення серіалізовано та десеріалізовано. Ось чому ви можете if (day == Days.SUNDAY)безкарно використовувати java, якщо Daysце тип переліку. Зробити це для власних занять, безумовно, можливо, але подбайте. Прочитайте Ефективну Java Джоша Блоха, щоб отримати докладні відомості та поради.