创建 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 的目标是让 quickSort1quickSort2 分开 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,你错过了重点:objects 是设计的单音。

它是复制到 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 被第一种方法修改,因此第二种方法也受到影响。