Tôi tin rằng có hai cách sử dụng liên quan của canonical: biểu mẫu và phiên bản.
Một hình thức kinh điển phương tiện mà giá trị của một loại hình cụ thể của tài nguyên có thể được mô tả hay thể hiện theo nhiều cách, và là một trong những cách được chọn là hình thức kinh điển được ưa chuộng. (Biểu mẫu đó được chuẩn hóa , giống như sách đã đưa nó vào kinh thánh, còn các biểu mẫu khác thì không.) Một ví dụ cổ điển về biểu mẫu chuẩn là các đường dẫn trong hệ thống tệp phân cấp, trong đó một tệp duy nhất có thể được tham chiếu theo một số cách :
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
Định nghĩa cổ điển về biểu diễn chuẩn của tệp đó sẽ là đường dẫn cuối cùng. Với các đường dẫn cục bộ hoặc tương đối, bạn không thể xác định toàn cục tài nguyên mà không có thông tin ngữ cảnh. Với các đường dẫn tuyệt đối, bạn có thể xác định tài nguyên, nhưng không thể biết liệu hai đường dẫn có tham chiếu đến cùng một thực thể hay không. Với hai hoặc nhiều đường dẫn được chuyển đổi sang dạng chuẩn, bạn có thể thực hiện tất cả những việc trên, đồng thời xác định xem hai tài nguyên có giống nhau hay không, nếu điều đó quan trọng đối với ứng dụng của bạn (giải quyết vấn đề răng cưa ).
Lưu ý rằng dạng chuẩn của tài nguyên không phải là chất lượng của chính dạng cụ thể đó; có thể có nhiều dạng chuẩn có thể có cho một loại nhất định như đường dẫn tệp (giả sử, về mặt từ vựng trước hết là đường dẫn tuyệt đối có thể có). Một biểu mẫu chỉ được chọn làm biểu mẫu chuẩn vì một lý do ứng dụng cụ thể, hoặc có thể tùy ý để mọi người nói cùng một ngôn ngữ.
Buộc các đối tượng vào các phiên bản chính tắc của chúng là cùng một ý tưởng cơ bản, nhưng thay vì xác định một đại diện "tốt nhất" của tài nguyên, nó tùy ý chọn một phiên bản của một lớp cá thể có cùng "nội dung" với tham chiếu chính tắc, sau đó chuyển đổi tất cả các tham chiếu tới các đối tượng tương đương để sử dụng một phiên bản chuẩn.
Đây có thể được sử dụng như một kỹ thuật để tối ưu hóa cả thời gian và không gian. Nếu có nhiều bản sao của các đối tượng tương đương trong một ứng dụng, thì bằng cách buộc tất cả chúng phải được giải quyết dưới dạng bản chính tắc duy nhất của một giá trị cụ thể, bạn có thể loại bỏ tất cả trừ một trong mỗi giá trị, tiết kiệm không gian và có thể là thời gian vì bây giờ bạn có thể so sánh những giá trị có danh tính tham chiếu (==) trái ngược với tương đương đối tượng ( equals()phương thức).
Một ví dụ cổ điển về tối ưu hóa hiệu suất với các phiên bản chuẩn là thu gọn các chuỗi có cùng nội dung. Việc gọi String.intern()trên hai chuỗi có cùng chuỗi ký tự được đảm bảo trả về cùng một đối tượng Chuỗi chính tắc cho văn bản đó. Nếu bạn chuyển tất cả các chuỗi của mình qua bộ chuẩn hóa đó, bạn biết các chuỗi tương đương thực sự là các tham chiếu đối tượng giống hệt nhau, tức là bí danh
Các kiểu enum trong Java 5.0+ buộc tất cả các phiên bản của một giá trị enum cụ thể phải sử dụng cùng một phiên bản chuẩn trong một máy ảo, ngay cả khi giá trị được tuần tự hóa và giải mã hóa. Đó là lý do tại sao bạn có thể sử dụng if (day == Days.SUNDAY)với impunity trong java nếu Dayslà một kiểu enum. Làm điều này cho các lớp học của riêng bạn chắc chắn là có thể, nhưng hãy cẩn thận. Đọc Java hiệu quả của Josh Bloch để biết chi tiết và lời khuyên.