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