web-dev-qa-db-ja.com

Kotlinオブジェクトの新しいインスタンスを作成

2つのインスタンスを作成しようとしているオブジェクトQuickSortがあります。 2つの別個のインスタンスを作成しようとすると、QuickSortクラスのカウントが不正確であるため、1つのインスタンスのみを使用していることがわかります。 Kotlinは、構文でnewを使用しません。これについてはどうすればよいでしょうか?

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

2つのインスタンスを作成する方法を次に示します。私の目標は、quickSort1およびquickSort22つの別個のインスタンスである。

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

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

試行された解決策QuickSortをオブジェクトからクラスに変換します。これにより、最初の呼び出しカウントを含む2番目のメソッドのカウントからわかるように、同じインスタンスが使用されます。

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

私は自分の問題を理解しました。同じArrayListをquickSortOne()とquickSortTwo()の両方に渡していました。 ArrayListは最初のメソッドによって変更されていたため、2番目のメソッドも影響を受けていました。

0
Adam Hurwitz

objectは、シングルトンのコトリンバージョンです。これを使用することで、すべてのユーザーが共有するインスタンスが1つだけになるように指定します。

classに変換すると、個別のインスタンスを作成できます。

8
Kiskae

アダム、あなたは全体のポイントを見逃しています:objectsは設計上は単音です。

これは、kotlinにコピーされた良好なscala featurasの1つです。

(JavaまたはC#では、normalいstaticメンバーと通常のクラスメンバーが混在しています)。

あなたの質問に関して:

A.いいえ、Java/C#で2つの異なるobjectを使用することはできないため、kotlin/scalaの2つのインスタンスStringを作成することはできません。

B. objectclassで置き換えるだけです(そして本当にnewが必要ですか?Pythonで見逃したことはありません)

2
Alex Yu

Objectキーワードは1つのインスタンスのみを作成するため、必ずクラスを使用する必要があります。クラス内でコンパニオンオブジェクトを使用して、作成されたクラスのインスタンスの数を追跡できます。

こちらもあなたが試す例です 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
0
nPn