簡體   English   中英

如何在沒有初始化的情況下在Kotlin中聲明一個val,可以從課堂上的任何樂趣中獲得?

[英]How can I declare a val in Kotlin without initialization that can be reached from any fun in the class?

我正在Kotlin中創建一個內容提供程序,它使用數據庫存儲數據並使用加載器查詢它們,問題是,我需要從任何函數都可以訪問我的DBHelper變量:onCreate,query,update等... In java這很容易但是在Kotlin中,IDE告訴我必須初始化val,我嘗試使用init塊但是android studio說DBHelper必須在onCreate()中初始化

那么,如何在Kotlin中創建一個可以為類中的任何函數啟用的val,並且可以在像Java這樣的onCreate函數中初始化?

這是我的代碼:

public class ProviderMMR : ContentProvider() {
var dbHelper


companion object Matcher{
    var uriMatcher = UriMatcher(UriMatcher.NO_MATCH)

    init{
        uriMatcher.addURI(MMDContract.columnas.AUTHORITY,MMDContract.columnas.TABLA_FARMACIA,1)
    }

}

override fun onCreate(): Boolean {
    dbHelper  =  mmrbd(context)

    return true
}

override fun insert(uri: Uri?, values: ContentValues?): Uri {
    val db = dbHelper.writableDatabase

    val rowID = db.insert(MMDContract.columnas.TABLA_FARMACIA, null, values)


    val uri_actividad = ContentUris.withAppendedId(MMDContract.columnas.CONTENT_BASE_URI, rowID)

    return uri_actividad



}

override fun query(uri: Uri?, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}


override fun update(uri: Uri?, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun delete(uri: Uri?, selection: String?, selectionArgs: Array<out String>?): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun getType(uri: Uri?): String {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

}

您還可以使用lazy delegate,它將在首次訪問時創建您的dbHelper對象

val dbHelper by lazy { mmrbd(context) }

您可以使用lateinit var並在onCreate中初始化它。 檢查延遲初始化的屬性和變量,以供參考。 https://kotlinlang.org/docs/reference/properties.html

那么你可以通過2-3種方式實現它,所以在Kotlin中我們有代理,它允許你在第一次訪問時初始化變量,即變量在第一次使用時被初始化,所以你可以做

val dbHelper by lazy { mmrbd(context) }

或者你可以用Java方式做到這一點你可以說:

var dbHelper: mmrbd? = null

並在OnCreate中初始化它,如: dbHelper = mmrbd(context)

或者你可以使用kotlin的lateinit關鍵字,它基本上允許你稍后初始化變量,但是你在使用變量之前初始化它的責任:

lateinit var dbHelper: mmrbd

並在OnCreate中初始化它,如: dbHelper = mmrbd(context)

如果你在多個地方使用“dbHelper”,最好使用延遲初始化程序,這樣變量可以有一次值並在調用時初始化,如果你沒有使用多個線程的“dbHelper”,你可以將LazyThreadSafetyMode.NONE添加到延遲初始化程序獲得更多的表現。 了解更多信息: https//kotlinlang.org/api/latest/jvm/stdlib/kotlin/-lazy-thread-safety-mode/-none.html

val uri by lazy(LazyThreadSafetyMode.NONE){
mmrbd(context)
}

如果你要使用lateinit你必須使用var,在你的情況下,最好添加私有集,這樣變量不會在類外部初始化

 class  ProviderMMR : ContentProvider() {
 companion object {
   lateinit var dbHelper: mmrbd
        private set
 }

override fun onCreate() {
    super.onCreate()
    dbHelper= mmrbd(context)
 }
}

暫無
暫無

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

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