9

我有一个对象QuickSort,我正在尝试创建 2 个实例。当我尝试创建 2 个单独的实例时,我可以看到它只使用一个实例,因为我在QuickSort类中有一个不准确的计数。Kotlin 在语法中不使用new,那么我该怎么做呢?

object QuickSort {
      var count = 0;
      quickSortOne(...){
          ...
          count++
          ...
      }
      quickSortTwo(...){
          ...
          count++
          ...
      }
  } 

这是我尝试创建 2 个实例的方式。我的目标是让quickSort1quickSort2成为 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))
4

4 回答 4

8

object是 kotlin 的单例版本。通过使用它,您可以指定只有 1 个实例由其所有用户共享。

把它变成一个class,你将能够创建单独的实例。

于 2017-11-01T00:18:49.073 回答
3

亚当,你错过了重点:objects 是设计上的单音。

这是复制到 kotlin 中的良好 scala 功能之一。

(在 java 或 C# 中,你有丑陋static的成员和普通的类成员)。

至于你的问题:

A. 不,您不能创建两个 kotlin/scala 实例,因为在 Java/C# 中object不能有两个不同的实例。String

B. 只需替换objectclass(你真的需要new吗?我从未在 python 中错过它)

于 2017-11-01T00:23:11.277 回答
2

您肯定希望使用一个类作为 object 关键字只创建一个实例。您可以在类中使用伴随对象来跟踪创建的类实例的数量。

这是一个示例,您也可以在这里尝试

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
于 2017-11-01T19:39:32.773 回答
2

我想出了我的问题。我将同一个 ArrayList 传递给 quickSortOne() 和 quickSortTwo()。由于第一种方法正在修改 ArrayList,因此第二种方法也受到了影响。

于 2017-11-04T05:42:23.883 回答