Kanonik'in iki ilişkili kullanımı olduğuna inanıyorum: formlar ve örnekler.
Bir standart bir şekilde kaynağın belirli bir türdeki değerleri, tarif edilen ya da birden fazla şekilde temsil edilir ve bu yollardan Tercih edilen bir standart form olarak seçilir edilebileceği anlamına gelir. (Bu form, İncil'e giren kitaplar gibi kanonlaştırılmıştır ve diğer formlar değildir.) Kanonik bir formun klasik bir örneği, tek bir dosyaya çeşitli şekillerde başvurulabilen hiyerarşik bir dosya sistemindeki yollardır. :
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
Bu dosyanın kanonik temsilinin klasik tanımı son yoldur. Yerel veya göreceli yollarla, bağlamsal bilgi olmadan kaynağı global olarak tanımlayamazsınız. Mutlak yollarla kaynağı tanımlayabilirsiniz, ancak iki yolun aynı varlığa başvurduğunu söyleyemezsiniz. Kanonik formlarına dönüştürülen iki veya daha fazla yolla, yukarıdakilerin hepsini yapabilir, ayrıca iki kaynağın aynı olup olmadığını belirleyebilir, bunun uygulamanız için önemli olup olmadığını belirleyebilirsiniz ( takma ad sorununu çözün ).
Bir kaynağın kanonik biçiminin, o belirli biçimin kendisinin bir kalitesi olmadığını unutmayın; dosya yolları gibi belirli bir tür için birden fazla olası kanonik form olabilir (örneğin, sözlükbilimsel olarak önce tüm olası mutlak yollar). Bir form, belirli bir uygulama nedeni için kanonik form olarak veya belki de keyfi olarak herkes aynı dili konuşacak şekilde seçilir.
Nesneleri kanonik örneklerine zorlamak aynı temel fikirdir, ancak bir kaynağın "en iyi" temsilini belirlemek yerine, rasgele bir örnek sınıfının bir örneğini kanonik referansla aynı "içeriğe" sahip bir örneğini seçer ve ardından tüm referansları dönüştürür bir kanonik örneği kullanmak için eşdeğer nesnelere.
Bu, hem zamanı hem de mekanı optimize etmek için bir teknik olarak kullanılabilir. Bir uygulamada eşdeğer nesnelerin birden çok örneği varsa, hepsini belirli bir değerin tek kanonik örneği olarak çözülmeye zorlayarak, her bir değerden biri hariç tümünü ortadan kaldırabilir ve artık karşılaştırabileceğiniz için yerden ve muhtemelen zamandan tasarruf edebilirsiniz. nesne eşdeğerliğine ( equals()yöntem) karşılık referans kimliğine (==) sahip bu değerler .
Standart örneklerle performansı optimize etmenin klasik bir örneği, aynı içeriğe sahip dizeleri daraltmaktır. Arayan String.intern()aynı karakter dizisi ile iki dizeleri o metinde aynı kanonik String nesnesi geri garantilidir. Tüm dizelerinizi bu kurallılaştırıcıdan geçirirseniz, eşdeğer dizelerin aslında aynı nesne başvuruları olduğunu bilirsiniz, yani takma adlar
Java 5.0+ sürümündeki enum türleri, belirli bir enum değerinin tüm örneklerini, değer serileştirilmiş ve serileştirilmemiş hale getirilmiş olsa bile bir VM içinde aynı kanonik örneği kullanmaya zorlar. Bu nedenle javada enum türü if (day == Days.SUNDAY)ise cezasız olarak kullanabilirsiniz Days. Bunu kendi dersleriniz için yapmak kesinlikle mümkündür, ancak dikkatli olun. Ayrıntılar ve tavsiye için Effective Java by Josh Bloch'u okuyun .