创建Kotlin对象的新实例

时间:2017-11-01 00:09:02

标签: kotlin kotlin-android-extensions kotlin-extension rx-kotlin

我有一个对象 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))

4 个答案:

答案 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,所以第二种方法也受到了影响。