创建 Kotlin 对象的新实例
Create New Instance of Kotlin Object
我有一个对象 QuickSort,我正在尝试为其创建 2 个实例。当我尝试创建 2 个单独的实例时,我可以看到它只使用了一个实例,因为我在 QuickSort class 中有一个不准确的计数。 Kotlin 在语法中不使用 new,那么我该怎么做呢?
object QuickSort {
var count = 0;
quickSortOne(...){
...
count++
...
}
quickSortTwo(...){
...
count++
...
}
}
以下是我尝试创建 2 instances.My 的目标是让 quickSort1 和 quickSort2 分开 2实例。
var quickSort1 = QuickSort
quickSort1.quickSortOne(...)
var quickSort2 = QuickSort
quickSort2.quickSortTwo(...)
尝试的解决方案:将 QuickSort 从对象转换为 class。这仍然会导致使用与第二个方法的计数(包括第一次调用计数)相同的实例。
class QuickSort {
var count = 0;
quickSortOne(...){
...
count++
...
}
quickSortTwo(...){
...
count++
...
}
}
...
var quickSortFirst = QuickSort()
printTest(quickSortFirst.quickSortFirst(arrayList, 0, arrayList.size - 1))
var quickSortLast = QuickSort()
printTest(quickSortLast.quickSortLast(arrayList, 0, arrayList.size - 1))
object
是 kotlin 版本的单例。通过使用它,您可以指定只有 1 个实例由所有用户共享。
将其变成 class
,您将能够创建单独的实例。
Adam,你错过了重点:object
s 是设计的单音。
它是复制到 kotlin 中的优秀 scala 特性之一。
(在 java 或 C# 中,丑陋的 static
成员与正常的 class 成员混合在一起。
关于你的问题:
一个。不,你不能制作两个 kotlin/scala object
的实例,因为你不能在 Java/C# 中有两个不同的 String
。
乙。只需将 object
替换为 class
(你真的需要 new
吗?我在 python 中从未错过)
您肯定想使用 class,因为 object 关键字仅创建一个实例。您可以在 class 中使用伴随对象来跟踪创建的 class 的实例数。
这是一个您也可以尝试的示例here
data class QuickSort(val objectName: String) {
init {
count++
}
companion object {
var count = 0
fun printCount() = println("count = $count")
}
}
fun main(args: Array<String>) {
QuickSort.printCount()
val quickSort1 = QuickSort("qs1")
QuickSort.printCount()
val quickSort2 = QuickSort("qs2")
QuickSort.printCount()
// just to prove you have two instances.
println(quickSort1)
println(quickSort2)
println("quickSort1 hashcode = ${quickSort1.hashCode()}, quickSort2 hashcode = ${quickSort2.hashCode()}")
}
产生:
count = 0
count = 1
count = 2
QuickSort(objectName=qs1)
QuickSort(objectName=qs2)
quickSort1 hashcode = 112207, quickSort2 hashcode = 112208
我解决了我的问题。我将同一个 ArrayList 传递给 quickSortOne() 和 quickSortTwo()。由于 ArrayList 被第一种方法修改,因此第二种方法也受到影响。
我有一个对象 QuickSort,我正在尝试为其创建 2 个实例。当我尝试创建 2 个单独的实例时,我可以看到它只使用了一个实例,因为我在 QuickSort class 中有一个不准确的计数。 Kotlin 在语法中不使用 new,那么我该怎么做呢?
object QuickSort {
var count = 0;
quickSortOne(...){
...
count++
...
}
quickSortTwo(...){
...
count++
...
}
}
以下是我尝试创建 2 instances.My 的目标是让 quickSort1 和 quickSort2 分开 2实例。
var quickSort1 = QuickSort
quickSort1.quickSortOne(...)
var quickSort2 = QuickSort
quickSort2.quickSortTwo(...)
尝试的解决方案:将 QuickSort 从对象转换为 class。这仍然会导致使用与第二个方法的计数(包括第一次调用计数)相同的实例。
class QuickSort {
var count = 0;
quickSortOne(...){
...
count++
...
}
quickSortTwo(...){
...
count++
...
}
}
...
var quickSortFirst = QuickSort()
printTest(quickSortFirst.quickSortFirst(arrayList, 0, arrayList.size - 1))
var quickSortLast = QuickSort()
printTest(quickSortLast.quickSortLast(arrayList, 0, arrayList.size - 1))
object
是 kotlin 版本的单例。通过使用它,您可以指定只有 1 个实例由所有用户共享。
将其变成 class
,您将能够创建单独的实例。
Adam,你错过了重点:object
s 是设计的单音。
它是复制到 kotlin 中的优秀 scala 特性之一。
(在 java 或 C# 中,丑陋的 static
成员与正常的 class 成员混合在一起。
关于你的问题:
一个。不,你不能制作两个 kotlin/scala object
的实例,因为你不能在 Java/C# 中有两个不同的 String
。
乙。只需将 object
替换为 class
(你真的需要 new
吗?我在 python 中从未错过)
您肯定想使用 class,因为 object 关键字仅创建一个实例。您可以在 class 中使用伴随对象来跟踪创建的 class 的实例数。
这是一个您也可以尝试的示例here
data class QuickSort(val objectName: String) {
init {
count++
}
companion object {
var count = 0
fun printCount() = println("count = $count")
}
}
fun main(args: Array<String>) {
QuickSort.printCount()
val quickSort1 = QuickSort("qs1")
QuickSort.printCount()
val quickSort2 = QuickSort("qs2")
QuickSort.printCount()
// just to prove you have two instances.
println(quickSort1)
println(quickSort2)
println("quickSort1 hashcode = ${quickSort1.hashCode()}, quickSort2 hashcode = ${quickSort2.hashCode()}")
}
产生:
count = 0
count = 1
count = 2
QuickSort(objectName=qs1)
QuickSort(objectName=qs2)
quickSort1 hashcode = 112207, quickSort2 hashcode = 112208
我解决了我的问题。我将同一个 ArrayList 传递给 quickSortOne() 和 quickSortTwo()。由于 ArrayList 被第一种方法修改,因此第二种方法也受到影响。