2008-11-11 45 views
67

Tôi thường nghe thuật ngữ này được sử dụng, nhưng tôi chưa bao giờ thực sự hiểu nó.Thuật ngữ "biểu mẫu chuẩn" hoặc "biểu diễn chuẩn" trong Java nghĩa là gì?

Điều đó có nghĩa là gì và ai cũng có thể đưa ra một số ví dụ/chỉ cho tôi một số liên kết?

EDIT: Cảm ơn mọi người đã trả lời. Bạn cũng có thể cho tôi biết làm thế nào biểu diễn kinh điển là hữu ích trong hiệu suất bằng(), như đã nêu trong Java hiệu quả?

Trả lời

46

Điểm Wikipedia với thuật ngữ Canonicalization.

Quy trình chuyển đổi dữ liệu có nhiều hơn một biểu diễn có thể có thành biểu diễn chuẩn "chuẩn". Điều này có thể được thực hiện để so sánh các biểu diễn khác nhau về tính tương đương, để đếm số cấu trúc dữ liệu riêng biệt, để cải thiện hiệu quả của các thuật toán khác nhau bằng cách loại bỏ các phép tính lặp lại hoặc để có thể áp đặt thứ tự sắp xếp có ý nghĩa.

Các Unicode dụ làm ý nghĩa nhất đối với tôi:

mã hóa Variable-length trong tiêu chuẩn Unicode, đặc biệt UTF-8, có nhiều hơn một mã hóa có thể cho nhân vật phổ biến nhất. Điều này làm cho việc xác nhận chuỗi phức tạp hơn, vì mọi mã hóa có thể có của mỗi ký tự chuỗi phải được xem xét. Một phần mềm thực hiện mà không xem xét tất cả các mã hóa ký tự chạy nguy cơ chấp nhận chuỗi được coi là không hợp lệ trong thiết kế ứng dụng, có thể gây ra lỗi hoặc cho phép các cuộc tấn công. Giải pháp là để cho phép một mã hóa duy nhất cho mỗi ký tự. Canonicalization sau đó là quá trình dịch mỗi ký tự chuỗi sang mã hóa được phép duy nhất của nó. Một giải pháp thay thế là cho phần mềm để xác định xem một chuỗi có được chuẩn hóa hay không, và sau đó từ chối nó nếu nó không phải là. Trong trường hợp này, trong ngữ cảnh máy khách/máy chủ, việc chuẩn hóa sẽ là trách nhiệm của khách hàng.

Tóm lại, một dạng biểu diễn chuẩn cho dữ liệu. Từ biểu mẫu này, bạn có thể chuyển đổi thành bất kỳ đại diện nào bạn có thể cần.

21

Từ "chuẩn" chỉ là một từ đồng nghĩa cho "chuẩn" hoặc "thông thường". Nó không có ý nghĩa cụ thể của Java.

+3

kinh điển có một ý nghĩa phong phú hơn so với tiêu chuẩn hoặc thông thường IMO. – squid

53

Tôi tin rằng có hai cách sử dụng có liên quan là kinh điển: biểu mẫu và thể hiện.

A hình thức kinh điển có nghĩa là giá trị của một loại tài nguyên cụ thể có thể được mô tả hoặc đại diện theo nhiều cách, và một trong những cách được chọn làm biểu mẫu chuẩn được ưu tiên. (Hình thức đó là đã được phong thánh hóa, như sách đã biến nó thành kinh thánh, và các hình thức khác thì không.) Ví dụ kinh điển về dạng kinh điển là đường dẫn trong hệ thống tệp phân cấp, trong đó một tệp có thể được tham chiếu trong một số theo 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 của biểu thức kinh điể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 bộ tài nguyên mà không có thông tin theo ngữ cảnh. Với đườ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 thành dạng chuẩn, bạn có thể thực hiện tất cả những điều trên, cộng vớ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 đề bí danh).

Lưu ý rằng dạng thức chuẩn của tài nguyên không phải là chất lượng của chính biểu mẫu cụ thể đó; có thể có nhiều hình thức kinh điển có thể cho một loại nhất định như đường dẫn tệp (ví dụ, trước tiên về mặt ngôn ngữ của tất cả các đường dẫn tuyệt đối có thể). Một biểu mẫu chỉ được chọn làm biểu mẫu chuẩn cho 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 trường hợp kinh điển là ý tưởng cơ bản giống nhau, nhưng thay vì xác định một biểu diễn "tốt nhất" của tài nguyên, nó tùy ý chọn một thể hiện của một thể loại có cùng "nội dung" tham chiếu, sau đó chuyển đổi tất cả các tham chiếu đến các đối tượng tương đương để sử dụng một cá thể kinh điển.

Điều này có thể được sử dụng làm kỹ thuật tối ưu hóa cả thời gian và không gian. Nếu có nhiều trường hợp 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 được giải quyết như một cá thể kinh điển duy nhất của một giá trị cụ thể, bạn có thể loại bỏ tất cả trừ một giá trị, tiết kiệm không gian và có thể là thời gian. các giá trị đó với định danh tham chiếu (==) trái ngược với đối tượng tương đương (phương pháp equals()).

Ví dụ điển hình 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. 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 chuẩn cho văn bản đó. Nếu bạn vượt qua tất cả các chuỗi của bạn thông qua bộ chỉnh sử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 nhau, tức là, các bí danh

Các loại enum trong Java 5.0+ buộc tất cả các trường hợp của một giá trị enum cụ thể để sử dụng cùng một thể hiện kinh điển trong một VM, ngay cả khi giá trị được tuần tự hóa và deserialized. Đó là lý do tại sao bạn có thể sử dụng if (day == Days.SUNDAY) với khả năng miễn dịch trong java nếu Days là loại 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 Hiệu quả Java bởi Josh Bloch để biết chi tiết và lời khuyên.

14

giảm xuống còn dưới hình thức đơn giản nhất và quan trọng nhất mà không làm mất tính tổng quát

0

đại diện kinh điển có nghĩa là xem các nhân vật trong phong cách khác nhau ví dụ nếu tôi viết một bức thư Một có nghĩa là người khác có thể viết chữ cái A trong phong cách khác nhau :)

Đây là theo ký tự quang học NHẬN LĨNH VỰC

2

một ví dụ điển hình có thể là: bạn có một lớp hỗ trợ việc sử dụng của Descartes (x, y, z), hình cầu (r, theta, phi) và trụ tọa độ (r, phi, z). Vì mục đích thiết lập sự bình đẳng (bằng phương pháp), bạn có thể muốn chuyển đổi tất cả các biểu diễn thành một biểu diễn "chuẩn" về lựa chọn của bạn, ví dụ: tọa độ hình cầu. (Hoặc có thể bạn sẽ muốn làm điều này nói chung - tức là sử dụng một biểu diễn bên trong.) Tôi không phải là một chuyên gia, nhưng điều này đã xảy ra với tôi như là một ví dụ cụ thể tốt.

4

Một cách dễ dàng để nhớ nó là cách "kinh điển" được sử dụng trong các vòng tròn thần học, sự thật kinh điển là sự thật thực sự vì vậy nếu hai người tìm thấy nó, họ đã tìm thấy cùng một sự thật. Tương tự với ví dụ kinh điển. Nếu bạn nghĩ rằng bạn đã tìm thấy hai trong số chúng (ví dụ: a.equals(b)), bạn thực sự chỉ có một (ví dụ: a == b). Vì vậy, bình đẳng ngụ ý nhận dạng trong trường hợp đối tượng kinh điển.

Bây giờ để so sánh.Bây giờ bạn có thể chọn sử dụng a==bhoặca.equals(b), vì chúng sẽ tạo ra cùng một câu trả lời trong trường hợp ví dụ kinh điển nhưng a = b là so sánh tham chiếu (JVM có thể so sánh hai con số cực kỳ nhanh vì chúng chỉ là hai . mẫu 32 bit so với a.equals(b) mà là một lời gọi phương thức và liên quan đến chi phí hơn

21

một ví dụ điển hình cho sự hiểu biết "kinh điển dạng/đại diện" là nhìn vào định nghĩa kiểu dữ liệu lược đồ XML của "boolean":

  • "biểu diễn từ vựng" của boolean có thể là một trong: {true, false, 1, 0} trong khi
  • các "kinh điển đại diện" chỉ có thể là một trong những {true, false}

này, trong bản chất, có nghĩa là

  • "true""1" được ánh xạ tới các repr kinh điển. "true"
  • "false""0" được ánh xạ tới đại diện canoncial. "false"

thấy the w3 XML schema datatype definition for boolean

0

Một hình thức kinh điển có nghĩa là một đại diện độc đáo tự nhiên của phần tử

Các vấn đề liên quan