Kotlin對象的生成方式整理

Kotlin中可能有如下幾種生成對象的方式

 

1,對象表達式

val myObject = object { } //匿名生成,賦給變量,或作爲匿名對象使用

一個最簡但完整的示例:

open class A(x: Int) {

    public open val y: Int = x

}

interface B { /*……*/ }

 

val ab: A = object : A(1), B {

    override val y = 15

    var x: Int = 0

    fun boo(){ }

}

注意

繼承自A(1),其中還上傳了一個參數給父類構造函數

實現接口B

對象內可以有方法及屬性,也可以覆蓋父類屬性

 

 

2,對象聲明,極方便的單例模式

object MyObject { } //不能是賦值的右值,直接給出名字

常用於監聽器示例

object DefaultListener : MouseAdapter() {

    override fun mouseClicked(e: MouseEvent) { …… }

    override fun mouseEntered(e: MouseEvent) { …… }

}

與對象表達式的區別在於:

(1),對象聲明不是表達式,不能放在賦值語句的右邊,所以要引用的話,上述示例只能直接使用DefaultListener這個名稱

(2),對象聲明的初始化過程是線程安全的並且在首次訪問時進行,因爲這是一個“聲明”,而之前的對象表達式是可執行語句的一部分

 

 

2.1,伴生對象是對象聲明的一種特例

class MyClass {

    companion object { } //匿名或不匿名生成,賦給class

}

 

3,任何面嚮對象語言都有的,即聲明類,再“new一個對象”,只不過kotlin省略了“new”

class Person(firstName: String) { }

val customer = Person("Joe Smith")

 

4,單方法Java接口可以生成Kotlin對象,但是Kotlin接口不能生成Kotlin對象

Java接口:

public interface Observer<T> {

    void onChanged(T t);

}

Kotlin對象:

wordViewModel.allWords.observe(this, Observer { words ->

    // Update the cached copy of the words in the adapter.

    words?.let { adapter.setWords(it) }

})

注意裏面的Observer,是一個單方法的接口,這裏使用了SAM轉換

注意多方法的Java接口不能轉換爲Kotlin對象,似乎這裏有討論:https://youtrack.jetbrains.com/issue/KT-7770

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章