Khối khởi tạo tĩnh trong Kotlin


83

Tương đương với khối khởi tạo tĩnh trong Kotlin là gì?

Tôi hiểu rằng Kotlin được thiết kế để không có những thứ tĩnh. Tôi đang tìm kiếm thứ gì đó có ngữ nghĩa tương đương - mã được chạy một lần khi lớp được tải lần đầu tiên.

Trường hợp sử dụng cụ thể của tôi là tôi muốn bật tính năng DayNight từ thư viện Android AppCompat và các hướng dẫn nói rằng hãy đặt một số mã vào khối khởi tạo tĩnh của Applicationlớp.

Câu trả lời:


122

Từ một số quan điểm, companion objects trong Kotlin tương đương với các phần tĩnh của các lớp Java. Đặc biệt, chúng được khởi tạo trước lần sử dụng đầu tiên của lớp và điều này cho phép bạn sử dụng các initkhối của chúng thay thế cho các trình khởi tạo tĩnh Java:

class C {
    companion object {
        init {
            //here goes static initializer code
        }
    }
}

1
đối tượng đồng hành là quá mức cần thiết ở đây
voddan

4
@voddan, OP đã hỏi về việc thực thi mã trước lần sử dụng đầu tiên của một lớp hiện có. Giải pháp với objectkhai báo yêu cầu một người thực sự sử dụng nó ở đâu đó vì khởi tạo lười biếng.
phím nóng

1
@voddan Bạn có muốn giải thích tại sao đó là mức quá mức cần thiết và đâu sẽ là những lựa chọn thay thế?
Marcin Koziński

2
Xin lỗi, thật tệ, tôi đã nhầm khi nghĩ rằng bạn không quan tâm đến việc xếp lớp. Các đối tượng đồng là giải pháp ngay tại đây
voddan

3
companion object  { 
    // Example for a static variable
    internal var REQUEST_CODE: Int? = 500

    // Example for a static method
    fun callToCheck(value: String): String {
        // your code
    }
}

Một khai báo đối tượng bên trong một lớp có thể được đánh dấu bằng từ khóa đồng hành và dưới điều này, chúng ta có thể sử dụng như phương thức tĩnh java và biến.LIke classname.methodname hoặc classname.variablename


THÊM MỘT SỐ GIẢI THÍCH VÀO MÃ CỦA BẠN
Freelancer

@DerickDaniel vui lòng kiểm tra ngay bây giờ.
abhilasha Yadav 19/07/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.