2009-04-23 37 views
15

Lớp java.lang.System xác định một số well-known properties.Tại sao Java không có hằng số cho các tên thuộc tính hệ thống nổi tiếng?

Ví dụ, bạn có thể lấy thư mục tạm thời của JVM bằng cách nhìn lên "java.io.tmpdir" bất động sản:

... = System.getProperty("java.io.tmpdir"); 

Những gì tôi không hiểu là tại sao những thuộc tính không được định nghĩa là hằng số (ví dụ: trong lớp java.lang.System). Điều này sẽ dễ bị lỗi hơn rất nhiều so với sử dụng chuỗi ký tự. Nói cách khác, tôi muốn có thể thực hiện điều này:

... = System.getProperty(System.JAVA_IO_TMPDIR); 

Mọi ý tưởng tại sao điều này không được thực hiện? Nó thậm chí có thể được thêm vào trong một bản phát hành Java trong tương lai mà không phá vỡ tính tương thích ngược. Hoặc tôi thiếu một cái gì đó hiển nhiên?

+2

Điều tôi đã làm là tự mình thực hiện. Mất khoảng 30 giây. my.package.SystemProperties và thêm các hằng số ở đó. Và sau đó để IDE của tôi giúp tôi từ đó. – OscarRyz

+2

> Những gì tôi đã làm là để thùng (sic) của riêng tôi. Và bạn không thực hiện bất kỳ lỗi chính tả nào? :-) Điều này minh họa chính xác lý do tại sao Sun nên làm điều này một lần thay vì để lại cho mỗi nhà phát triển cá nhân. Con người là con người và phạm sai lầm. –

+0

Không, 0 lỗi chính tả. Tôi sao chép dán chúng và chỉ thêm những giá trị mà tôi sử dụng (thường là chỉ khoảng 4) :-) – OscarRyz

Trả lời

9

Tất cả các thuộc tính được ghi dưới System.getProperties() được chuẩn hóa - mọi triển khai Java SE đều phải cung cấp chúng. Không có lý do gì mà Java 7 không thể giới thiệu các hằng số cho các tên thuộc tính chuẩn này. Nó sẽ không ngăn cản sự ra đời của các thuộc tính mới. Tôi nghĩ rằng nó chỉ là không ai nghĩ rằng nó có giá trị nỗ lực (thậm chí bổ sung tầm thường để Java API lõi phải đi qua các quá trình tôi nghĩ).

9

Đoán của tôi là Sun không muốn cam kết với một tập hợp các thuộc tính hệ thống được xác định trước. Nếu chúng không được định nghĩa là các contants, chúng có thể thêm các thuộc tính hệ thống bất cứ lúc nào (ngay cả khi chúng chỉ phát hành một phiên bản gia tăng của JDK như từ 1.4.1 đến 1.4.2).

Chỉnh sửa:
Mọi hằng số được xác định trước phải được coi là một phần của API. Vì vậy, thậm chí thay đổi số lượng hằng số là một thay đổi API. Bằng cách không định nghĩa bất kỳ hằng số nào, Sun được phép định nghĩa các thuộc tính hệ thống mới mà không đưa ra thay đổi API.

+1

+1 Chắc chắn nhất. – OscarRyz

+0

Tôi không hiểu lý do của bạn ở đây; sử dụng hằng số cho tên thuộc tính sẽ không ngăn các thuộc tính mới được thêm vào. Trong mọi trường hợp, cách dễ dàng hơn và ít rủi ro hơn để thêm một hằng số hơn là thực hiện đối tượng địa lý mà hằng số biểu diễn, vì vậy tôi không biết tại sao họ sẽ không thực hiện cả hai cùng một lúc. Ví dụ, ít công việc hơn để thêm một dòng xác định hằng số System.JAVA_IO_TMPDIR hơn là thực hiện tính năng theo đó JVM có thể biết thư mục tạm thời của nó. –

+1

@Andrew: Bởi vì cách đó mã nguồn của java.lang.System được tách hoàn toàn khỏi giá trị thuộc tính/khóa mà hệ thống máy chủ có. – OscarRyz

-5

Sự khác nhau giữa số "literal"LITERAL là gì?

Hai ký tự: "".

Không thể thấy lý do tại sao bận tâm phát minh ra một tập hợp phức tạp của LITERAL s khi "literal" cũng hoạt động.

+12

Sự khác biệt là trình biên dịch có thể cho bạn biết nếu có lỗi đánh máy trong LITERAL nhưng không phải nếu có lỗi đánh máy trong "rác". – jmucchiello

+4

Plus, IDE có thể tự động hoàn thành, do đó bạn không phải tạo một chương trình nhỏ trước để in các giá trị và sau đó sao chép/dán kết quả vào mã. – OscarRyz

+6

Bởi vì tôi muốn tìm lỗi nhiều hơn tại thời gian biên dịch so với thời gian chạy! –

1

Để hoàn chỉnh, Apache commons lang có lớp SystemUtils cung cấp hằng chung và phương pháp xác định trước.

Điều này tồn tại từ vài năm và rất có thể là tốt bạn đã sử dụng commons lang (2 hoặc 3).

SystemUtils.getUserHome(); 
SystemUtils.getJavaIoTmpDir(); 
SystemUtils.JAVA_IO_TMPDIR; 
SystemUtils.USER_HOME; 
Các vấn đề liên quan