A previous question cho biết cách đặt bộ khởi tạo tĩnh bên trong một lớp bằng cách sử dụng companion object
. Tôi đang cố gắng tìm một cách để thêm một initializer tĩnh ở mức gói, nhưng có vẻ như các gói không có đối tượng đồng hành.Làm cách nào để viết trình khởi tạo tĩnh cấp gói trong Kotlin?
// compiler error: Modifier 'companion' is not applicable inside 'file'
companion object { init { println("Loaded!") } }
fun main(args: Array<String>) { println("run!") }
Tôi đã thử các biến thể khác mà có thể đã thực hiện nghĩa (init
ngày của riêng mình, static
), và tôi biết như là một workaround tôi có thể sử dụng một throwaway val
như trong
val static_init = {
println("ugly workaround")
}()
nhưng có cách nào chính xác, sạch sẽ để đạt được kết quả tương tự không?
Chỉnh sửa: Là @mfulton26's answer đề cập, không có chức năng nào như chức năng cấp gói thực sự trong JVM. Phía sau hậu trường, trình biên dịch kotlin là wrapping any free functions, including main
in a class. Tôi đang cố gắng thêm bộ khởi tạo tĩnh vào rằng lớp - lớp được tạo bởi kotlin cho các hàm miễn phí được khai báo trong tệp.
Tại sao không sử dụng 'main' để thực hiện việc khởi tạo? – mfulton26
Vì tôi đã chọn một ví dụ đồ chơi xấu. Hãy tưởng tượng một tập tin đầy đủ các chức năng miễn phí liên quan mà tất cả phụ thuộc vào một số khởi tạo chia sẻ. Có thể cho rằng tôi chỉ có thể quấn những thứ đó vào một “vật thể” có tên, nhưng rất nhiều vẻ đẹp của kotlin thường không bị buộc phải làm những việc như thế. – Dan
OK. Thật không may là tôi không biết cách nào để làm điều đó ngoài giải pháp thay thế của bạn hoặc một biến thể. ví dụ. 'val static_init = run {println (" workaround ")}' hoặc 'val static_init = object {init {println (" workaround ")}}'. – mfulton26