Properties Kotlin-可为null的属性默认为null值

Properties Kotlin-可为null的属性默认为null值,properties,kotlin,nullable,Properties,Kotlin,Nullable,假设我定义了一个具有可为null的属性的类 class ABC { var myProperty: String? = null } 有没有办法将其默认为空值? 也许是类似SCALA的东西 var myProperty: String? = _ // compilation error 或者简单地说: var myProperty: String? // compilation error 我知道我们可以使用一个lateinit变量,Kotlin 1.2中的变量可以在以后检查初始

假设我定义了一个具有可为null的属性的类

class ABC {
   var myProperty: String? = null
}
有没有办法将其默认为空值? 也许是类似SCALA的东西

var myProperty: String? = _  // compilation error
或者简单地说:

var myProperty: String?  // compilation error
我知道我们可以使用一个lateinit变量,Kotlin 1.2中的变量可以在以后检查初始化,如下所示:

lateinit var myProperty: String

if (::myProperty.isInitialized) {
   //value is not-null
}

那么,lateinit是首选的方式吗?默认为空值是可能的还是故意忽略了它?

Kotlin故意要求您显式初始化所有属性。没有速记语法。对于可为null类型的属性,首选方法不是使用
lateinit
,而是使用
null
初始值设定项声明它

用于
lateinit
属性的
isInitialized
方法设计用于处理复杂情况,如清理资源;对于希望在写入属性声明时保存
=null
的用户,它不是用来代替
null
检查。

简短回答是否。

与其他一些语言(Scala、Go)不同,Kotlin并不认为它最清楚该类型的默认值是什么(谁说int的默认值应该是0?)

您也可以声明一个全局函数

fun nullString(): String? {
    return null
}
像这样使用它

class ABC {
   var myProperty = nullString()
}
由于语言中只有一个空引用,因此全局变量也可以工作

var nullString : String? = null

class ABC {
   var myProperty = nullString
}
附言-
不幸的是,Kotlin中保留了像“\u1”这样的空间字符,因此您无法使用它命名变量并创建
var myProperty=\ucode>

您在此处将其默认为null:
var myProperty:String?=空
lateinit
不会将其默认为任何值,使用
isInitialized
的显式检查是一种与
lateinit
功能背后的意图背道而驰的黑客行为。换句话说,您不可能必须使用
late init
(这会在早期访问时引发异常)或者显式初始化变量。@MarkoTopolnik
var myProperty:String?=null
默认为null,但我发现
=null
是多余的,并且试图简化代码,因此您不是在询问默认为用户提供的值,而是询问内置的隐式默认值。科特林的一般咒语是“明确”,这是一个例子。@MarkoTopolnik我只需要字符串?默认为null,没有明确说明。但lateinit似乎最符合我的需要。谢谢“谁说int应该是0?”-逻辑:)<代码>0
对它有很多意义。如果使用数据,则
null
0
之间的差异是巨大的。假设您做了一个销售记录,但由于连接问题,
unitsSold
值没有设置,您想使用
0
(这意味着没有售出任何东西)还是
null
(意味着数据未知)?当使用计数器时,默认设置为
0
是有意义的,但是还有更多的用例。这取决于语言的目标:保存击键或让开发人员考虑其默认值。我猜Kotlin是针对后者的:KTLLINE DEVS应该考虑将'''作为变量值初始化器添加到“类型缺省值”中,即int值为0,字符串为空。