2010-03-01 40 views
20

Đối tượng Properties của Java đã không thay đổi nhiều kể từ tiền Java 5 và chưa có hỗ trợ Generics hoặc phương thức trợ giúp rất hữu ích (mẫu được định nghĩa để cắm vào các lớp để xử lý thuộc tính hoặc giúp tải tất cả các tệp thuộc tính trong thư mục , ví dụ).Thuộc tính Java có bị phản đối hiệu quả không?

Việc phát triển các thuộc tính có dừng lại không? Nếu vậy, thực hành tốt nhất hiện tại cho loại thuộc tính này đang lưu/tải là gì?

Hoặc tôi đã hoàn toàn bỏ lỡ điều gì đó?

+0

Và còn về java.util.Dictionary thì sao? Nó đã được cập nhật để sử dụng Generics, nhưng nó cũng từ lâu đã được ghi nhận là "lỗi thời". Tuy nhiên, nó vẫn không được đánh dấu là @deprecated. Tôi đoán việc phản đối là một vấn đề khó khăn. – omerkudat

+0

@omerkudat, Từ điển về cơ bản là Bản đồ trước Bộ sưu tập trong 1.2.Mặc dù không chính thức bị phản đối, nó nằm trong cùng một nhóm với Vector. Điều đó thường không được ưa thích. http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated/ – Yishai

Trả lời

10

Rất nhiều khái niệm xung quanh Thuộc tính chắc chắn là cổ và có vấn đề. Nó có các ngôn ngữ rất nghèo, nó bổ sung thêm các phương thức mà ngày nay sẽ được thực hiện thông qua kiểu generic, nó mở rộng Hashtable, bản thân nó không được sử dụng, vì đồng bộ của nó có giá trị giới hạn và nó có các phương thức không hài hòa với Các lớp bộ sưu tập được giới thiệu trong 1.2 và nhiều phương thức được thêm vào lớp Thuộc tính về cơ bản cung cấp loại an toàn kiểu được thay thế bằng Generics.

Nếu được triển khai hôm nay, có thể sẽ là triển khai đặc biệt của Map<String, String> và chắc chắn hỗ trợ mã hóa tốt hơn trong tệp thuộc tính.

Điều đó đang được nói, không thực sự là sự thay thế không làm tăng thêm sự phức tạp. Chắc chắn java.util.prefs.Preferences api là "mới và được cải thiện" nhưng nó thêm một lớp phức tạp vượt xa những gì cần thiết cho nhiều trường hợp sử dụng. Chỉ cần sử dụng XML cũng là một lựa chọn (mà ít nhất là sửa chữa các vấn đề quốc tế hóa) nhưng một đối tượng đặc tính thường phù hợp với nhu cầu tốt, tại thời điểm đó sử dụng nó.

+0

Để quốc tế hóa, bạn thường sử dụng API ResourceBundle. Kiểm tra http://java.sun.com/developer/technicalArticles/javase/i18n_enhance/ và http://bordet.blogspot.com/2007/01/utf-8-handling-for-resourcebundle-and.html – BalusC

+2

@BalusC Đoán của tôi là Yishai gọi các quirks của các tập tin thuộc tính mã hóa như là "quốc tế nghèo", và theo mặc định ResourceBundle sử dụng cùng một mã hóa. –

1

Cấu trúc từ điển là một trong những cấu trúc được sử dụng lâu đời nhất trong hầu hết các ngôn ngữ lập trình http://en.wikipedia.org/wiki/Associative_array, tôi nghi ngờ nó sẽ không được dùng nữa.

Thậm chí nếu bị xóa, sẽ sớm có triển khai mới bên ngoài lõi.

Đã có các tiện ích mở rộng bên ngoài, commache apache là tài nguyên tuyệt vời mà tôi nghĩ đã giúp định hình java trong những năm qua, xem http://commons.apache.org/configuration/howto_properties.html.

+1

Giao diện Bản đồ Bộ sưu tập và những người triển khai dường như là giải pháp chính thức của Java cho mảng Associative - IMHO là một điều thuận tiện hơn – Brabster

7

Nó vẫn là giải pháp khả thi cho các yêu cầu cấu hình đơn giản. Họ không cần hỗ trợ generics bởi vì các khóa và giá trị Property vốn dĩ là Strings, nghĩa là chúng được lưu trữ trong các tệp ascii phẳng. Nếu bạn cần un/marshaling/serialization của các đối tượng, Properties không phải là cách tiếp cận đúng. Phương pháp ưa thích hiện là java.util.prefs.Preferences cho bất kỳ thứ gì ngoài nhu cầu cấu hình vừa phải tinh vi.

3

Thực hiện những gì cần làm. Nó không phải là khó để viết hỗ trợ cho việc đọc trong tất cả các tập tin thuộc tính trong một thư mục. Tôi sẽ nói rằng đó không phải là một trường hợp sử dụng phổ biến, vì vậy tôi không thấy điều đó là thứ cần phải có trong JDK.

Ngoài ra, nó đã thay đổi chút ít từ trước Java 5, như Javadoc nói rằng mở rộng Hashtable<Object, Object> và thực hiện Map<Object, Object>.

+1

Để giải thích lý do tại sao 'Hashtable ' không 'Hashtable ' xem: http://stackoverflow.com/questions/873510/why-does-java-util-properties -implement-mapobject-object-and-not-mapstring-str –

+0

Cảm ơn bạn đã liên kết @Tom Hawtin, đọc thú vị. – Brabster

2

"chưa có hỗ trợ Generics", tại sao cần hỗ trợ generics; nó đề cập đến các giá trị chuỗi và chuỗi khóa Tôi sẽ không xem xét các thuộc tính Java không được chấp nhận. Đó là một thư viện trưởng thành - đó là tất cả

+2

nó thực sự giao dịch với các khóa Object và các giá trị đối tượng - để hạn chế các giá trị String và String, bạn sẽ cần generics. – Brabster

+0

Lớp này cung cấp các chức năng tiện lợi chuỗi khóa và chuỗi giá trị. – dbrown0708

+2

@brabster và @ dbrown0708 API dựa trên đối tượng được xem trong Thuộc tính do thiết kế kém. Người xây dựng nó bị bỏ qua: "Thành phần ưu tiên thừa kế" mặc dù ý định khác nhau (Như đã nêu trong javadoc: "Lớp Thuộc tính thể hiện một bộ thuộc tính liên tục. Thuộc tính có thể được lưu vào luồng hoặc được tải từ luồng. và giá trị tương ứng của nó trong danh sách thuộc tính là một chuỗi. ") –

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