2017-05-04 21 views
8

Hôm nay tôi đang thực hiện Closeable trong kotlin, và như tôi đã làm trong java trước đây, tôi muốn triển khai finalize() làm dự phòng cuối cùng trong trường hợp mã khách hàng quên đóng, hiển thị tài nguyên quan trọng chưa được khai hoang . Tôi xem xét tài nguyên này đủ quan trọng để thêm dự phòng này, mặc dù không đáng tin cậy của dự phòng này. Tuy nhiên, kotlin.Any không khai báo một phương pháp finalize, có nghĩa là tôi không thể simplydo này:Làm cách nào để triển khai finalize() trong kotlin?

class Resource: Closeable { 
    fun close() {} 
    override fun finalize() { close()} 
} 

Đây không phải là tốt, ít nhất là không tốt như nó phải được. Bây giờ tôi trở lại Java đơn giản như một cách giải quyết. Có ai biết làm thế nào để làm điều này trong Kotlin tinh khiết?

PS: Cách giải quyết của tôi hiện tại:

FinalizedCloseable.java:

public abstract class FinalizedCloseable implement Closeable { 
    @Override protected void finalize() { close(); } 
} 

Kotlin:

class Resource: FinalizedCloseable(), Closeable { 
    fun close() {} 
    override fun finalize() { close()} 
} 

Nhưng cách giải quyết này đòi hỏi một lớp cha. Nếu lần sau, Resource khác của tôi đã có một siêu lớp, cách giải quyết này sẽ không hoạt động nếu không có nhiều bản mẫu.


EDIT: Bây giờ tôi biết làm thế nào để thực hiện hoàn thiện(), nhưng IDEA Kotlin plugin là không đủ thông minh để biết rằng đây là một finalizer và do đó đánh dấu nó với một số cảnh báo. Sau khi đấu tranh cho một thời gian tôi thấy làm thế nào để ngăn chặn những cảnh báo này, và tôi muốn chia sẻ nó:

class C { 
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() {} 
} 
+1

https://kotlinlang.org/docs/reference/java- interop.html # finalize – ean5533

+0

@ ean5533 Uh Tôi đã không đọc toàn bộ tài liệu dài interop đó, và bây giờ là hình phạt của tôi. Cảm ơn bạn anyway. – glee8e

+0

Bạn đã đọc “[finalize() được gọi trên đối tượng có thể truy cập mạnh trong Java 8] (https://stackoverflow.com/q/26642153/2711488)”? Điểm mấu chốt là, bạn nên tốt hơn không làm điều đó cả. Trừ khi mã của bạn liên quan đến mã nguồn gốc trực tiếp, lớp của bạn sẽ là một trình bao bọc xung quanh một đối tượng khác thực sự đại diện cho tài nguyên và cho phép khả năng kết nối của trình bao bọc xác định thời gian sống của tài nguyên thực (đang sử dụng), có nghĩa là yêu cầu các vấn đề nghiêm trọng… – Holger

Trả lời

12

Các official documentation diện này.

Để ghi đè hoàn thiện(), tất cả các bạn cần làm chỉ đơn giản là khai báo nó, mà không sử dụng các từ khóa override:

class C { 
    protected fun finalize() { 
     // finalization logic 
    } 
} 
+0

Đánh bại tôi theo giây phút :) – ean5533

+0

Cảm ơn bạn! Đó là tất cả tôi cần! Nhưng tại sao stackoverflow cấm chọn anwser trước 12 phút đã dán ... – glee8e

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