[英]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.