Saya percaya ada dua penggunaan terkait kanonik: bentuk dan contoh.
Bentuk kanonik berarti bahwa nilai dari jenis sumber daya tertentu dapat dideskripsikan atau direpresentasikan dalam berbagai cara, dan salah satu cara tersebut dipilih sebagai bentuk kanonis yang disukai. (Formulir itu dikanonisasi , seperti buku yang dimasukkan ke dalam Alkitab, dan bentuk lain tidak.) Contoh klasik dari formulir kanonis adalah jalur dalam sistem file hierarki, di mana satu file dapat dirujuk dalam beberapa cara :
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
Definisi klasik dari representasi kanonis file itu akan menjadi jalur terakhir. Dengan jalur lokal atau relatif, Anda tidak dapat mengidentifikasi sumber daya secara global tanpa informasi kontekstual. Dengan jalur absolut, Anda dapat mengidentifikasi sumber daya, tetapi tidak dapat mengetahui apakah dua jalur merujuk ke entitas yang sama. Dengan dua jalur atau lebih yang dikonversi ke bentuk kanonisnya, Anda dapat melakukan semua hal di atas, plus menentukan apakah dua sumber daya sama atau tidak, apakah itu penting untuk aplikasi Anda (selesaikan masalah aliasing ).
Perhatikan bahwa bentuk kanonik dari sumber daya bukanlah kualitas dari bentuk itu sendiri; mungkin ada beberapa kemungkinan bentuk kanonis untuk jenis tertentu seperti jalur file (misalnya, secara leksikografis pertama-tama kemungkinan jalur absolut). Satu formulir hanya dipilih sebagai bentuk kanonik karena alasan aplikasi tertentu, atau mungkin sewenang-wenang sehingga semua orang berbicara dalam bahasa yang sama.
Memaksakan objek ke dalam instance kanonisnya adalah ide dasar yang sama, tetapi alih-alih menentukan satu representasi "terbaik" dari sebuah sumber daya, itu sewenang-wenang memilih satu instance dari kelas instance dengan "konten" yang sama sebagai referensi kanonis, lalu mengonversi semua referensi ke objek yang setara untuk menggunakan satu instance kanonik.
Ini dapat digunakan sebagai teknik untuk mengoptimalkan waktu dan ruang. Jika ada beberapa contoh objek yang setara dalam sebuah aplikasi, maka dengan memaksa semuanya untuk diselesaikan sebagai satu contoh kanonik dari nilai tertentu, Anda dapat menghilangkan semua kecuali satu dari setiap nilai, menghemat ruang dan mungkin waktu karena Anda sekarang dapat membandingkan nilai-nilai tersebut dengan identitas referensi (==) sebagai lawan dari kesetaraan objek ( equals()
metode).
Contoh klasik dalam mengoptimalkan performa dengan instance kanonis adalah menciutkan string dengan konten yang sama. Memanggil String.intern()
dua string dengan urutan karakter yang sama dijamin akan mengembalikan objek String kanonis yang sama untuk teks tersebut. Jika Anda meneruskan semua string Anda melalui canonicalizer itu, Anda tahu bahwa string yang setara sebenarnya adalah referensi objek yang identik, yaitu alias
Jenis enum di Java 5.0+ memaksa semua instance dari nilai enum tertentu untuk menggunakan instance kanonik yang sama dalam VM, meskipun nilainya diserialkan dan dideserialisasi. Itulah mengapa Anda dapat menggunakan if (day == Days.SUNDAY)
dengan impunitas di java jika Days
merupakan tipe enum. Melakukan ini untuk kelas Anda sendiri tentu saja mungkin, tetapi hati-hati. Bacalah Effective Java oleh Josh Bloch untuk detail dan nasihatnya.