2015-01-07 23 views
5

Là một người mới bắt đầu java, tôi muốn hỏi về liệu tôi có nên đặt một tham chiếu đối tượng thành null hay gọi phương thức hoàn thiện trong một dự án lớn không?Đặt tham chiếu đối tượng thành null hoặc gọi phương thức finalize()?

Ví dụ,

while(obj... some code here){ 
//code stuff 
} 
obj = null; // or obj.finalize(); 

Kể từ khi im thực hiện với sự obj và không có nhiều tài liệu tham khảo để nó những gì tôi nên làm gì với nó? đặt nó thành null hoặc gọi finalize() ;?

Tôi đọc số java doc nhưng đoạn này The finalize method is never invoked more than once by a Java virtual machine for any given object. nhầm lẫn tôi. Điều đó có nghĩa rằng ngay cả khi tôi sử dụng nó, nó sẽ không làm bất cứ điều gì ở tất cả trừ khi GC quyết định làm như vậy? Sau đó, quyết định của tôi là đặt obj thành trợ giúp null có được không?

Tất cả điều này giả định một dự án lớn của nó và phạm vi vẫn chưa kết thúc để GC tự giải quyết nó. Cảm ơn.

+0

Điều này có thể giúp hiểu rõ phương thức 'finalize' và GC: http://stackoverflow.com/questions/2506488/when-is-the-finalize-method-called-in-java – wassgren

+0

Cảm ơn bạn đã trả lời wassgren, tôi đã đọc các tài liệu java như đã nêu. Nhưng có những giải pháp được đưa ra như [this] (http://howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java/) đã buộc phương pháp finallize và thực sự hoạt động, và tôi đã tự hỏi bạn nên làm gì trên một dự án lớn. – Voqus

+0

Không bao giờ sử dụng ** hoàn thành ** phương pháp. Nó là hoàn toàn không thể đoán trước. –

Trả lời

1

KHÔNG BAO GIỜ gọi phương thức finalize() của đối tượng theo cách thủ công. Nó chỉ dành cho việc sử dụng máy ảo. VM sẽ gọi nó vào một thời điểm thích hợp (như một phần của quá trình thu gom rác).

Bạn có thể đặt biến tham chiếu thành null để có thể làm cho đối tượng đủ điều kiện thu gom rác sớm hơn nếu không, nhưng làm như vậy không làm cho GC trở thành ngay lập tức. (Lưu ý rằng bạn sử dụng toán tử = cho các bài tập;. == là một nhà điều hành quan hệ cho thử nghiệm sự bình đẳng của toán hạng của nó)

Nếu đối tượng của bạn duy trì trạng thái đó bạn phải đảm bảo được dọn dẹp theo yêu cầu, sau đó thực hiện một khác nhau phương pháp cho điều đó. close() là tên phổ biến cho các phương pháp như vậy. Thực hành tốt là tránh thực hiện finalize() nếu có thể. GC sẽ tự động quản lý hầu hết các tài nguyên mà bạn có thể nghĩ rằng bạn muốn dọn dẹp thủ công trong finalize().

+0

Sẽ ghi đè phương thức hoàn thiện tại đối tượng đó và gọi nó có khác biệt gì không? Khi tôi đọc [this] (http://stackoverflow.com/a/18510658/4422074) câu trả lời nó đưa nó vào xem xét, nó có đúng không? – Voqus

+1

Tôi lặp lại: ** KHÔNG BAO GIỜ ** gọi phương thức 'finalize()' của đối tượng theo cách thủ công. Nó không tạo ra sự khác biệt nào cho dù nó là một thừa hưởng từ 'java.lang.Object' hoặc ghi đè lên. Câu trả lời bạn liên kết là tuyệt vời, bằng cách này, và không có cách nào nó mâu thuẫn với bất cứ điều gì tôi nói. –

+0

Được rồi, cảm ơn một nhóm đã trả lời câu hỏi của tôi. – Voqus

7

Không. Nếu obj không còn được sử dụng nữa trong mã (và không có gì khác tham chiếu cùng một đối tượng như obj), đối tượng sẽ không thể truy cập được nữa và sẽ trở thành ứng cử viên cho Garbage Collection.

Đặt obj thành null sẽ không đạt được bất kỳ điều gì (YMMV tùy thuộc vào việc triển khai bộ thu gom rác).

Để gọi finalize(), đừng. Hãy để Garbage Collector quan tâm đến điều đó. Nhưng lưu ý rằng finalize là một phương pháp giống như bất kỳ phương pháp nào khác. Nội dung bạn trích dẫn là nói rằng GC sẽ không gọi nó nhiều hơn một lần, bất kể số lần mã của bạn có thể đã gọi nó.

+0

Có nhưng liệu obj có đủ điều kiện để GC được chọn trong suốt thời gian chạy hay nó sẽ đợi cho phạm vi của phương thức mà obj được gọi là kết thúc và quyết định? Cũng như tôi đã viết trong một bình luận khác, liệu nó có đáng để ép buộc phương thức finallize hay không? Như ví dụ đã nêu [ở đây] (http: // howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java /) – Voqus

+1

@VasilisCh Là người mới bắt đầu, bạn không nên lo lắng về điều đó. Hãy để GC tự động chăm sóc nó. Nó sẽ phát hiện khi đối tượng không còn sử dụng và xóa nó. Chỉ cần dừng tham chiếu đối tượng khi bạn sử dụng xong nó và mọi thứ sẽ tự chăm sóc. –

+1

@VasilisCh Không, phạm vi là khái niệm khác nhau xác định nơi bạn có thể sử dụng tên. Điều gì xử lý GC đủ điều kiện là khả năng tiếp cận. –

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