Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何优雅地在Kotlin中使用init构造_Oop_Syntax_Kotlin - Fatal编程技术网

Oop 如何优雅地在Kotlin中使用init构造

Oop 如何优雅地在Kotlin中使用init构造,oop,syntax,kotlin,Oop,Syntax,Kotlin,在类构造期间,有许多方法可以使用init,但它们大多不使用实际的类属性 我需要做的是初始化对象init上数据库中的一个类属性。到目前为止,我有: class MyObj constructor(val id: Long){ var data: MutableMap? = null init { data = db.find(id) // more like pseudocode, db fetch is done and result assigned to dat

在类构造期间,有许多方法可以使用
init
,但它们大多不使用实际的类属性

我需要做的是初始化对象init上数据库中的一个类属性。到目前为止,我有:

class MyObj constructor(val id: Long){

   var data: MutableMap? = null

   init {
       data = db.find(id) // more like pseudocode, db fetch is done and result assigned to data property
   }
}

但我觉得有点太复杂了。有没有更好、更优雅的方法来实现这一点?

您可以直接在类主体中初始化属性:

class MyObj(val id: Long) {
     val data: MutableMap = db.find(id)
}

这样您就不需要将其声明为可为null的类型,并且可以使用
val
而不是
var
。(我还删除了多余的
构造函数
关键字。)

您可以直接在类主体中初始化属性:

class MyObj(val id: Long) {
     val data: MutableMap = db.find(id)
}
这样您就不需要将其声明为可为null的类型,并且可以使用
val
而不是
var
。(我还删除了多余的
构造函数
关键字。)

您只需写:

class MyObj constructor(val id: Long){
    val data: Map<String, String> = mapOf()
}
类MyObj构造函数(valid:Long){ val数据:Map=mapOf() }
这相当于:

class MyObj constructor(val id: Long){
    val data: Map<String, String>
    init {
        data = mapOf()
    }
}
类MyObj构造函数(valid:Long){ val数据:地图 初始化{ data=mapOf() } }
如果您需要为对象初始化引入一些逻辑,比如错误检查等,Init块非常有用。您可以使用Init块或不使用Init块。但请记住更具可读性的内容:

class MyObj constructor(val id: Long){
    val data: Map<String, String> = if (id == 0L) {
        mapOf(Pair("", ""))
    } else {
        throw IllegalStateException()
    }
} // without init

class MyObj constructor(val id: Long){
    val data: Map<String, String>

    init {
        data = if (id == 0L) {
            mapOf(Pair("", ""))
        } else {
            throw IllegalStateException()
        }
    }
} // with init
类MyObj构造函数(valid:Long){ val数据:映射=if(id==0L){ 映射(成对(“,”)) }否则{ 抛出非法状态异常() } }//不带init 类MyObj构造函数(valid:Long){ val数据:地图 初始化{ 数据=if(id==0L){ 映射(成对(“,”)) }否则{ 抛出非法状态异常() } } }//使用init
您还可以使用lazy初始化该值(这意味着属性将被初始化为函数,但值将在您第一次请求时分配,而不是在创建对象时分配)。我想从db中获取值可能会很长,因此它可能很有用:

val data: Map<String, String> by lazy { mapOf() }
val数据:通过惰性{mapOf()映射
您只需编写:

class MyObj constructor(val id: Long){
    val data: Map<String, String> = mapOf()
}
类MyObj构造函数(valid:Long){ val数据:Map=mapOf() }
这相当于:

class MyObj constructor(val id: Long){
    val data: Map<String, String>
    init {
        data = mapOf()
    }
}
类MyObj构造函数(valid:Long){ val数据:地图 初始化{ data=mapOf() } } 如果您需要为对象初始化引入一些逻辑,比如错误检查等,Init块非常有用。您可以使用Init块或不使用Init块。但请记住更具可读性的内容:

class MyObj constructor(val id: Long){
    val data: Map<String, String> = if (id == 0L) {
        mapOf(Pair("", ""))
    } else {
        throw IllegalStateException()
    }
} // without init

class MyObj constructor(val id: Long){
    val data: Map<String, String>

    init {
        data = if (id == 0L) {
            mapOf(Pair("", ""))
        } else {
            throw IllegalStateException()
        }
    }
} // with init
类MyObj构造函数(valid:Long){ val数据:映射=if(id==0L){ 映射(成对(“,”)) }否则{ 抛出非法状态异常() } }//不带init 类MyObj构造函数(valid:Long){ val数据:地图 初始化{ 数据=if(id==0L){ 映射(成对(“,”)) }否则{ 抛出非法状态异常() } } }//使用init 您还可以使用lazy初始化该值(这意味着属性将被初始化为函数,但值将在您第一次请求时分配,而不是在创建对象时分配)。我想从db中获取值可能会很长,因此它可能很有用:

val data: Map<String, String> by lazy { mapOf() }
val数据:通过惰性{mapOf()映射

您不能将不可为null的
val
init
一起使用吗?是的,如果您删除
=null
初始值设定项,则可以使用该初始值设定项,如果您在
init
中赋值,则该初始值是多余的,对吗?在任何情况下,这都不会产生影响。换句话说,你应该删除
=null
,不管有没有
init
。我现在觉得有点傻:)关于Kotlin还有很多东西要学。似乎每次我写了很长的东西,它可能写得不好,并且有一些更简单的解决方案。美好的不能将不可为null的
val
init
一起使用吗?是的,如果删除
=null
初始值设定项,则可以使用该初始值设定项,如果在
init
中赋值,则该初始值是多余的,对吗?在任何情况下,这都不会产生影响。换句话说,你应该删除
=null
,不管有没有
init
。我现在觉得有点傻:)关于Kotlin还有很多东西要学。似乎每次我写了很长的东西,它可能写得不好,并且有一些更简单的解决方案。美好的我将接受这一点,因为我发现还有一些额外的提示很有用。谢谢:)如果错误检查只针对null,那么它可能会缩短为这样的
val data:Map=db.find(id)?:throw IllegalStateException()
。所以它可以停留在一行上,而且目标变量不必为null。我将接受这一点,因为我发现有一些额外的提示很有用。谢谢:)如果错误检查只针对null,那么它可能会缩短为这样的
val data:Map=db.find(id)?:throw IllegalStateException()
。因此它可以停留在一行上,而且目标变量不必为null。