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。