web-dev-qa-db-fra.com

Créer une nouvelle instance d'objet Kotlin

J'ai un objet QuickSort que je tente de créer 2 instances de. Lorsque j'essaie de créer 2 instances distinctes, je constate que l'utilisation d'une seule instance est inexistante, car le compte que j'ai dans la classe QuickSort est inexact. Kotlin n'utilise pas new dans la syntaxe, alors comment pourrais-je m'y prendre?

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

Voici comment je tente de créer mes 2 instances. Mon objectif est d’avoir quickSort1 et quickSort2 deux instances distinctes.

var quickSort1 = QuickSort
quickSort1.quickSortOne(...)

var quickSort2 = QuickSort
quickSort2.quickSortTwo(...)

Solution tentée : Conversion de QuickSort d'un objet en classe. Il en résulte que la même instance est toujours utilisée, comme indiqué par le nombre de la deuxième méthode, y compris le premier nombre d'appels.

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))
3
Adam Hurwitz

object est une version kotlin d'un singleton. En l'utilisant, vous spécifiez qu'il n'y aura qu'une seule instance partagée par tous ses utilisateurs.

Transformez-le en class et vous pourrez créer des instances individuelles.

7
Kiskae

Adam, vous ratez tout le problème: objects sont des singeletones par conception.

C'est l'un des bons scala featuras copiés dans Kotlin.

(En Java ou en C #, vous avez des membres laids static mélangés avec des membres de classe normaux).

Quant à votre question:

R. Non, vous ne pouvez pas créer deux instants de kotlin/scala object car vous ne pouvez pas avoir deux String différents en Java/C #. 

B. Il suffit de remplacer object par class (et avez-vous vraiment besoin de new? Je ne l'ai jamais manqué en python)

2
Alex Yu

Vous voulez certainement utiliser une classe car le mot clé object ne crée qu'une instance. Vous pouvez utiliser un objet compagnon de la classe pour suivre le nombre d'instances de la classe créées.

Voici un exemple que vous essayez aussi ici

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()}")
}

qui produit:

count = 0
count = 1
count = 2
QuickSort(objectName=qs1)
QuickSort(objectName=qs2)
quickSort1 hashcode = 112207, quickSort2 hashcode = 112208
0
nPn