变量在启动时为null,初始化后不能为null

时间:2018-07-01 09:47:19

标签: kotlin

在Kotlin中是否有任何方法可以在应用程序启动时对变量null进行注释,并且在创建变量后无法将其再次分配给null

我无法将字段设置为var someField: Boolean?因为它可以在某个时候为空,或者lateinit var someField: Boolean因为期望在使用该字段之前初始化它(或者这是解决我的情况的正确方法?)。

4 个答案:

答案 0 :(得分:3)

我不确定为什么lateinit对您不起作用,除了对原始类型不起作用之外,但notNull delegate可能正是您要寻找的:

class X {
    var z: String by Delegates.notNull()
}

val x1 = X()
x1.z = "foo"
println(x1.z) // foo

val x2 = X()
println(x2.z) // IllegalStateException: Property z should be initialized before get.

如果在设置之前阅读它,它将给您一个例外,否则该属性将具有非null类型。

答案 1 :(得分:0)

我不确定,因为我没有真正看到要执行的操作,但是为什么初始化时不创建var?因此var永远不会为null,您将不必使用null初始化

如果您真的需要此var来检查它是否为null更改它,为什么不使用int而不是bool?

答案 2 :(得分:0)

使用Latenit声明它:lateinit var someField: Boolean
并分配了非null值后,像这样someField!!
有了这个注释,您就对编译器说somefield不是null,但保持它为非空是您的责任。

答案 3 :(得分:0)

当使用比$("img").attr("src",$.datepicker.formatDate("dd-mm-yy", date)); 更复杂的类型时,应考虑在其周围实现Null-Value-Pattern。 Kotlin 为此类用例提供了一种简洁的结构:

$("img").attr("alt",$.datepicker.formatDate("dd-mm-yy", date));

像这样,您不会遇到任何可空性问题。您也可以直接在实现中定义默认值。