2012-11-02 18 views
5

Trong mã nguồn của com.sun.org.apache.xerces.internal.impl.XMLScanner tại dòng 183 và 186tự động thực tập của xâu

183 protected final static String fVersionSymbol = "version".intern(); 

186 protected final static String fEncodingSymbol = "encoding".intern(); 

Tại sao "phiên bản""mã hóa" đang thực tập nội trú một cách rõ ràng bằng cách sử dụng tập() khi họ đang chuỗi chữ và sẽ được tự động interned?

+2

+1 Câu hỏi hay! Hiệu ứng là như nhau, tuy nhiên bytecode được tạo ra có và không có khác nhau. Tôi đoán chúng tôi sẽ không bao giờ biết trừ khi chúng tôi yêu cầu trực tiếp với các tác giả vì vậy điều này không thể được trả lời. Tôi sẽ nói đây là tối ưu hóa sớm. – OscarRyz

Trả lời

6

Tôi đã theo dõi sự thay đổi thành revision 318617 in the Apache Xerces SVN Repository (đây là dự án mà trình phân tích cú pháp XML này ban đầu được phát triển, như tên gói đề xuất).

Phần liên quan của thông điệp cam kết là:

Đang cố gắng để cải thiện việc sử dụng các bảng biểu tượng. Nhiều chuỗi được xác định trước là được thêm vào bảng biểu tượng mỗi lần trình phân tích cú pháp được đặt lại. Đối với các tài liệu nhỏ, đây sẽ là một chi phí đáng kể. Bây giờ, vì chúng ta gọi String # intern cho Strings trong bảng biểu tượng, nó đủ để sử dụng String # intern cho các ký hiệu được xác định trước là . Điều này chỉ cần được thực hiện một lần.

Như bạn đã lưu ý, không được cần thiết .intern() (và sẽ không có hiệu lực rõ ràng) trên thực thi JVM phù hợp.

tôi đoán là

  • hoặc tác giả đã không nhận thức được thực tế là xâu sẽ luôn luôn được thực tập nội trú
  • hoặc nó là một quyết định có ý thức để tránh chống lại một thực hiện misbehaving JVM

Trong trường hợp thứ hai, tôi mong đợi một số lưu ý rằng trong nhận xét hoặc trong thông báo nhận xét, tuy nhiên.

Một hiệu ứng phụ của cuộc gọi .intern() đó là các trình khởi tạo không còn là constant expressions và các trường khác sẽ không được các lớp khác tham chiếu. Điều đó sẽ đảm bảo rằng lớp học XMLScanner được tải và trường được đọc. Tôi không nghĩ rằng điều này là có liên quan ở đây, tuy nhiên.

+1

từ thư cam kết: '... –

4

Tôi không tin có bất kỳ lý do chính đáng cho điều đó, vì lý do bạn xác định: Literals luôn tự động thực tập nội trú, như defined by the String class:

Tất cả các chuỗi chữ và các biểu thức hằng số chuỗi giá trị đang thực tập nội trú. Chuỗi ký tự được định nghĩa trong phần 3.10.5 của Đặc tả Ngôn ngữ Java ™.

+1

vì vậy nó là một ví dụ về mã hóa xấu? –

+2

@aLearner: Tôi cho là vậy. Tôi có lẽ sẽ không đặt nó khá mạnh mẽ, nhưng ít nhất là nếu có một lý do chính đáng để làm điều đó (mà tôi nghi ngờ) tôi sẽ mong đợi một bình luận giải thích nó là gì. –

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