我有一个对象 QuickSort ,我试图创建2个实例。当我尝试创建2个单独的实例时,我可以看到它只使用一个实例,因为我在 QuickSort 类中有一个不准确的计数。 Kotlin在语法中没有使用 new ,所以我该怎么做呢?
object QuickSort {
var count = 0;
quickSortOne(...){
...
count++
...
}
quickSortTwo(...){
...
count++
...
}
}
以下是我尝试创建2个实例的方法。我的目标是让 quickSort1 和 quickSort2 成为2个独立的实例。
var quickSort1 = QuickSort
quickSort1.quickSortOne(...)
var quickSort2 = QuickSort
quickSort2.quickSortTwo(...)
尝试解决方案:将 QuickSort 从对象转换为类。这仍然导致使用相同的实例,如第二种方法的计数所示,包括第一次调用计数。
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))
答案 0 :(得分:7)
object
是单身人士的kotlin版本。通过使用它,您可以指定只有1个实例由其所有用户共享。
将其变为class
,您就可以创建单个实例。
答案 1 :(得分:2)
亚当,你错过了重点:object
是设计上的骷髅。
这是一个很好的scala featuras复制到kotlin。
(在java或C#中,你有丑陋的static
成员和普通的班级成员混在一起。)
关于你的问题:
一个。不,你不能做两个kotlin / scala object
,因为你可以在Java / C#中有两个不同的String
。
B中。只需将object
替换为class
(你真的需要new
吗?我从来没有错过它在python中)
答案 2 :(得分:0)
您肯定希望使用类,因为object关键字只创建一个实例。您可以使用类中的伴随对象来跟踪创建的类的实例数。
以下是您尝试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
答案 3 :(得分:-1)
我想出了我的问题。我将同一个ArrayList传递给quickSortOne()和quickSortTwo()。由于第一种方法正在修改ArrayList,所以第二种方法也受到了影响。