【问题标题】:Create New Instance of Kotlin Object创建 Kotlin 对象的新实例
【发布时间】:2017-11-01 00:09:01
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

将其转换为class,您将能够创建单独的实例。

【讨论】:

  • 将 QuickSort 从一个对象转换为一个类仍然会导致使用相同的实例,如第二个方法的计数(包括第一次调用计数)所示。
【解决方案2】:

Adam,你错过了重点:objects 在设计上是单音。

这是复制到 kotlin 中的一个很好的 scala 功能。

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

至于你的问题:

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

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

【讨论】:

  • 将 QuickSort 从一个对象转换为一个类仍然会导致使用相同的实例,如第二个方法的计数所示,包括第一次调用计数。
  • 当然!因为你写了companion object - 它们有点接近/等同于 Java/C# 中的静态成员。
【解决方案3】:

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

这是一个例子,你也可以试试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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2018-01-02
      相关资源
      最近更新 更多