ĐIỀU NÀY NÊN CÙNG JAVA 9 NHÉ!
Sử dụng java.util.Cleaner
thay thế! (Hoặc sun.misc.Cleaner
trên JRE cũ hơn)
Bài gốc:
Tôi nhận thấy rằng việc sử dụng PhantomRefferences có gần như cùng một số vấn đề như các phương pháp hoàn thiện (nhưng sẽ ít vấn đề hơn khi bạn hiểu đúng). Tôi đã viết một giải pháp nhỏ (một khuôn khổ rất nhỏ để sử dụng PhantomRefferences) cho Java 8. Nó cho phép sử dụng các biểu thức lambda làm lệnh gọi lại để chạy sau khi đối tượng đã bị loại bỏ. Bạn có thể đăng ký các lệnh gọi lại cho các tài nguyên bên trong cần được đóng lại. Với điều này, tôi đã tìm ra một giải pháp phù hợp với tôi vì nó làm cho nó thực tế hơn nhiều.
https://github.com/claudemartin/java-cleanup
Dưới đây là một ví dụ nhỏ cho thấy cách đăng ký gọi lại:
class Foo implements Cleanup {
//...
public Foo() {
//...
this.registerCleanup((value) -> {
try {
// 'value' is 'this.resource'
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
Và sau đó, có một phương pháp đơn giản hơn để tự động đóng, thực hiện tương tự như ở trên:
this.registerAutoClose(this.resource);
Để trả lời câu hỏi của bạn:
[thì việc sử dụng nó là gì]
Bạn không thể dọn dẹp những thứ không tồn tại. Nhưng nó có thể có các tài nguyên vẫn tồn tại và cần được dọn dẹp để có thể loại bỏ chúng.
Nhưng việc sử dụng khái niệm / lớp này là gì?
Nó không nhất thiết phải làm bất cứ điều gì với bất kỳ hiệu ứng nào ngoài gỡ lỗi / ghi nhật ký. Hoặc có thể để thống kê. Tôi thấy nó giống một dịch vụ thông báo từ GC hơn. Bạn cũng có thể muốn sử dụng nó để xóa dữ liệu tổng hợp trở nên không liên quan sau khi đối tượng bị xóa (nhưng có lẽ có những giải pháp tốt hơn cho điều đó). Các ví dụ thường đề cập đến việc đóng các kết nối cơ sở dữ liệu, nhưng tôi không thấy đây là một ý tưởng hay vì bạn không thể làm việc với các giao dịch. Một khung ứng dụng sẽ cung cấp một giải pháp tốt hơn nhiều cho điều đó.
Bạn đã bao giờ sử dụng cái này trong bất kỳ dự án nào của mình chưa, hoặc bạn có ví dụ nào mà chúng ta nên sử dụng cái này không? Hay là khái niệm này được tạo ra chỉ cho quan điểm phỏng vấn;)
Tôi sử dụng nó chủ yếu chỉ để ghi nhật ký. Vì vậy, tôi có thể theo dõi các phần tử bị loại bỏ và xem cách GC hoạt động và có thể được tinh chỉnh. Tôi sẽ không chạy bất kỳ mã quan trọng nào theo cách này. Nếu một cái gì đó cần phải được đóng lại thì nó nên được thực hiện trong một câu lệnh try-with-resource-. Và tôi sử dụng nó trong các bài kiểm tra đơn vị, để đảm bảo rằng tôi không bị rò rỉ bộ nhớ. Cách làm tương tự như jontejj. Nhưng giải pháp của tôi là tổng quát hơn một chút.