Kotlin:伴随对象 lateinit vars 初始化一次吗?
Kotlin: are companion object lateinit vars initialised once?
给定以下代码:
class Foo {
companion object {
lateinit var names: Array<String>
}
init {
names = arrayOf("George", "Keith", "Martha", "Margret")
}
}
如果我创建了 Foo
的两个实例:
var foo1 = Foo();
var foo2 = Foo();
是 names
将是 initialised/assigned 两次,因此任何后续 Foo
初始化?
我的意图是让一个简单的静态变量 names
保存那些预定义的名称。
更新:
这是假设我不希望有:var names: arrayOf("George", "Keith", "Martha", "Margret")
inside companion object。
Kotlin 中的伴随对象与 java 中的静态方法相同。通过在我们的 class 中声明一个伴随对象,您将能够使用与在 Java.And 中调用静态方法相同的语法来调用它的成员是的,它也会在 kotlin 中被初始化一次,我们有一个
more 单例实例的关键字,用于在 kotlin 中创建单例。
另一方面,init 将在主构造函数之后调用,您也可以让一个或多个 init 块依次执行。
is names going to be initialised/assigned twice, and therefore with
any subsequent Foo initialisation?
正如在 init 中一样,它每次都会初始化 names
,因此它会为每个实例创建新的 Array
。
你可以通过简单的打印来验证这一点
class Foo {
companion object {
lateinit var names: Array<String>
}
init {
println("Creating Foo")
names = arrayOf("George", "Keith", "Martha", "Margret")
}
fun getHashCode():Int{
return names.hashCode()
}
}
fun main() {
var foo1 = Foo();
println(foo1.getHashCode());
var foo2 = Foo();
println(foo2.getHashCode());
}
输出哈希码不同:
Creating Foo
746292446
Creating Foo
1072591677
您可以尝试下面的代码块来实现您想要的。
class Foo {
object ArrayOfString {
val names = arrayOf("George", "Keith", "Martha", "Margret")
}
companion object {
val names: Array<String> = ArrayOfString.names
}
}
这样,你的数组就不会每次都初始化,希望有意义!
class Foo {
Var names :ArrayList<String> = arrayOf("George", "Keith", "Martha", "Margret")
companion object {
lateinit var names: Array<String>
}}
你可以这样做
给定以下代码:
class Foo {
companion object {
lateinit var names: Array<String>
}
init {
names = arrayOf("George", "Keith", "Martha", "Margret")
}
}
如果我创建了 Foo
的两个实例:
var foo1 = Foo();
var foo2 = Foo();
是 names
将是 initialised/assigned 两次,因此任何后续 Foo
初始化?
我的意图是让一个简单的静态变量 names
保存那些预定义的名称。
更新:
这是假设我不希望有:var names: arrayOf("George", "Keith", "Martha", "Margret")
inside companion object。
Kotlin 中的伴随对象与 java 中的静态方法相同。通过在我们的 class 中声明一个伴随对象,您将能够使用与在 Java.And 中调用静态方法相同的语法来调用它的成员是的,它也会在 kotlin 中被初始化一次,我们有一个 more 单例实例的关键字,用于在 kotlin 中创建单例。
另一方面,init 将在主构造函数之后调用,您也可以让一个或多个 init 块依次执行。
is names going to be initialised/assigned twice, and therefore with any subsequent Foo initialisation?
正如在 init 中一样,它每次都会初始化 names
,因此它会为每个实例创建新的 Array
。
你可以通过简单的打印来验证这一点
class Foo {
companion object {
lateinit var names: Array<String>
}
init {
println("Creating Foo")
names = arrayOf("George", "Keith", "Martha", "Margret")
}
fun getHashCode():Int{
return names.hashCode()
}
}
fun main() {
var foo1 = Foo();
println(foo1.getHashCode());
var foo2 = Foo();
println(foo2.getHashCode());
}
输出哈希码不同:
Creating Foo
746292446
Creating Foo
1072591677
您可以尝试下面的代码块来实现您想要的。
class Foo {
object ArrayOfString {
val names = arrayOf("George", "Keith", "Martha", "Margret")
}
companion object {
val names: Array<String> = ArrayOfString.names
}
}
这样,你的数组就不会每次都初始化,希望有意义!
class Foo {
Var names :ArrayList<String> = arrayOf("George", "Keith", "Martha", "Margret")
companion object {
lateinit var names: Array<String>
}}
你可以这样做