2017-05-08 23 views
21

Tôi muốn có thể lưu một thể hiện lớp cho một biến tĩnh công cộng nhưng tôi không thể tìm ra cách để làm điều này trong Kotlin.Kotlin phương pháp tĩnh và biến

class Foo { 

    public static Foo instance; 
    public Foo() { 
     instance = this; 
    } 

} 
+6

https://kotlinlang.org/docs/reference/classes.html#companion-objects. Nhưng điều đó có vẻ khủng khiếp với tôi.Tại sao bạn muốn sử dụng một trường tĩnh có thể thay đổi (thực hành xấu), và sửa đổi nó mỗi khi bạn xây dựng một thể hiện của Foo? Bạn đang cố gắng đạt được điều gì? –

+3

Nếu bạn muốn tạo một singleton, hãy xem https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations. –

Trả lời

32

Điều gần nhất với trường tĩnh Java là một đối tượng đồng hành. Bạn có thể tìm thấy những tài liệu tham khảo tài liệu hướng dẫn cho họ ở đây: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

Mã của bạn trong Kotlin sẽ giống như thế này:

class Foo { 

    companion object { 
     lateinit var instance: Foo 
    } 

    init { 
     instance = this 
    } 

} 

Nếu bạn muốn các lĩnh vực của bạn/phương pháp để được tiếp xúc như tĩnh để gọi Java, bạn có thể áp dụng các @JvmStatic chú thích:

class Foo { 

    companion object { 
     @JvmStatic lateinit var instance: Foo 
    } 

    init { 
     instance = this 
    } 

} 
+2

Việc sử dụng 'đối tượng đồng hành' để khai báo một trường' instance' là một bản mẫu được tự động xử lý bởi trình biên dịch Kotlin nếu bạn chỉ đơn giản khai báo 'Foo' như một đối tượng' Foo {...} ' –

4

đầu tiên bạn tạo một lớp đơn giản thì sau khi tạo ra một khối tiếp theo từ khóa đối tượng đồng

ví dụ:

class Test{ 

    companion object{ 

     fun getValue(): String{ 

      return "Test String" 

     } 
    } 
} 

bạn có thể gọi chức năng lớp này sử dụng tên lớp dot chức năng tên

ví dụ:

// here you will get the function value 
Test.getValue() 
0

Bạn có thể tạo một đối tượng đồng cho các lớp, và nếu bạn thực sự là trường nào là tĩnh, bạn có thể sử dụng chú thích @JvmStatic. Đối tượng đồng hành có quyền truy cập vào các thành viên riêng tư của lớp mà nó đồng hành.

Xem dưới đây một ví dụ:

class User { 
    private lateinit var name: String 

    override fun toString() = name 

    companion object { 
     @JvmStatic 
     val instance by lazy { 
      User().apply { name = "jtonic" } 
     } 
    } 
} 

class CompanionTest { 

    @Test 
    fun `test companion object`() { 
     User.instance.toString() shouldBe "jtonic" 
    } 
} 
9

Có vẻ mà bạn muốn xác định một đối tượng singleton. Nó được hỗ trợ trong Kotlin như là một khái niệm hạng nhất:

object Foo { 
    ... 
} 

Tất cả mã boilerplate với trường tĩnh và hàm tạo được Kotlin tự động quan tâm. Bạn không cần phải viết bất cứ điều gì.

Từ mã Kotlin, bạn có thể tham chiếu đến cá thể của đối tượng này chỉ đơn giản là Foo. Từ mã Java, bạn có thể tham chiếu đến cá thể của đối tượng này là Foo.INSTANCE, vì trình biên dịch Kotlin tự động tạo ra trường tĩnh tương ứng có tên là INSTANCE.

1

Nếu bạn làm theo phong cách viết các thống kê ở đầu lớp trong Java, thì tôi khuyên bạn nên thử xem xét viết chúng ở cấp cao nhất (ví dụ: trước khi khai báo lớp) trong Kotlin. Đối với nhiều trường hợp sử dụng, nó hoạt động tốt hơn so với giới thiệu một người bạn đồng phản đối

Sample Code:

class Person { 
    companion object Test { 
    fun callMe() = println("I'm called.") 
    } 
} 

fun main(args: Array<String>) { 
Person.callMe() 
} 

Khi bạn chạy chương trình, đầu ra sẽ là:

Tôi đang gọi.

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