2014-11-11 15 views
9

AutoCloseable được giới thiệu trong jdk1.7 và Cloesable đã có trong jdk1.5.Tại sao Java7 giới thiệu AutoCloseable đặc biệt?

Và Theo https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Các thử-với-nguồn tuyên bố đảm bảo rằng mỗi tài nguyên được đóng ở phần cuối của báo cáo kết quả. Bất kỳ đối tượng nào triển khai java.lang.AutoCloseable, bao gồm tất cả các đối tượng thực hiện java.io.Closeable, có thể được sử dụng làm tài nguyên.

Vì vậy, trường hợp Closeable đã có thể được coi là tài nguyên trong tuyên bố try-with-resources. Điều này là chắc chắn, kể từ khi Closeable kéo dài từ AutoCloseable.

Câu hỏi của tôi là lý do tại sao java đặc biệt giới thiệu AutoCloseable, tại sao họ không chỉ thực hiện được để được hỗ trợ trong try-with-resources, có cách nào khác để sử dụng AutoCloseable ngoại trừ try-with-resources?

Trả lời

11

Closeable bị giới hạn để ném IOException, điều này có thể không phù hợp với một số tài nguyên có thể đóng được nhưng không phải IO.

AutoCloseable được khai báo để ném Exception, làm cho mục đích chung hơn.

API cho Closeable không thể thay đổi để ném Exception vì đó sẽ là thay đổi đột phá, do đó là siêu kết nối mới.

Ngoài ra, như documented:

Lưu ý rằng không giống như các phương pháp close của Closeable, phương pháp gần đây không phải là cần thiết để được idempotent. Nói cách khác, gọi phương thức đóng này nhiều lần có thể có một số tác dụng phụ có thể nhìn thấy, không giống như Closeable.close được yêu cầu không có hiệu lực nếu được gọi nhiều lần. Tuy nhiên, những người triển khai giao diện này được khuyến khích mạnh mẽ để làm cho các phương thức đóng của họ không có giá trị.

Vì vậy, trong khi mọi CloseableAutocloseable, ngược lại là không đúng sự thật, và nó sẽ bị hạn chế để hạn chế try-catch-cuối cùng đến ngữ nghĩa của Closeable.

+0

Cảm ơn bạn rất nhiều !! Tôi nghĩ lý do đầu tiên là thuyết phục hơn. Nó sẽ là tuyệt vời nếu bạn có thể cập nhật câu trả lời của bạn và cho chúng ta một ví dụ về tài nguyên có 'close()' không ném 'IOException'. – Jaskey

+0

@Jaskey: 'ResultSet' là một ví dụ tốt, trong đó' close() 'ném' SqlException'. –

0

Sự khác biệt giữa hai là các lớp thực hiện Closeable phải đảm bảo rằng việc gọi close() nhiều lần không có tác dụng phụ. Không có giới hạn như vậy trên AutoCloseable.

Trong thực tế, điều này có nghĩa là mọi thứ phải là Closeable nhưng những lớp đó cần được trang bị thêm có thể chọn ít hạn chế AutoCloseable.

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