簡體   English   中英

接口作為Kotlin的財產

[英]Interface as property in Kotlin

在一些片段和其他類中(在Java中)我有一個public interface ISomeActions ,其函數可以從該類中的其他部分調用,以表示操作。 所以,我有一個我在構造函數中設置的ISomeListener listener ,或者在我創建SomeClass的對象之后。 我如何在Kotlin實現這一目標?

例:

public class SomeClass{
    public ISomeListener listener;
    public interface ISomeListener{
       public void doSomething();
    }

    void actuallyDoSomething(){
        listener.doSomething();
    }
}

我想我可以使用一個lateinit var listener : SomeListener ,但我不知道這是否足夠。 該成員是一個接口,如果在Activity完成后調用它,則不是該接口的實現。

1)構造函數

class MyClass(private val myInterface: MyInterface) { ... }

這樣myInterface是不可變的。 您可以確定這永遠不會為空。

2)創建對象后 - null

class MyClass(var myInterface: MyInterface? = null) { ... }

現在myInterface是可變的,任何時候都可以為null。 你可以通過myInterface?.someMethod()安全地訪問它myInterface?.someMethod()myInterface是不會被調用的null調用)。 要訪問和分配監聽器,請使用myClassInstance.myInterface = myInterfaceInstance

由於默認參數,您可以使用或不使用構造函數參數創建類:

val myClass1 = MyClass()
val myClass2 = MyClass(interfaceInstanceOrNull)

3)創建對象后 - lateinit

class MyClass(myInterface: MyInterface? = null) {
    lateinit var _myInterface: MyInterface
    init {
        if (myInterface != null) { _myInterface = myInterface }
    }
}

在我看來,最糟糕的解決方案。 lateinit是為創建后注入字段而設計的,適用於像dagger這樣的DI框架。 如果你嘗試調用方法myInterface ,如果它不初始化尚未UninitializedPropertyAccessException將被拋出。 您可以檢查屬性是否初始化為:

if (::_myProperty.isInitialized) { _myProperty.doSth() }

在我看來,你應該使用第一種或第二種方法。 據我所知,你不能總是使用MyInterface的實例初始化對象,所以第二個似乎對你的主題是合法的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM