2017年7月14日金曜日

Kotlin メモ : data class で List はいい感じに処理してくれるけど Array おまえはダメだ

data class A と B と C があって、C は A の配列と B を持っています。
  1. data class A(val name: String)  
  2.   
  3. data class B(val age: Int)  
  4.   
  5. data class C(val names: Array<A>, val age: B)  
A と B に対する以下のテストは通ります
  1. assertEquals(A("hoge"), A("hoge"))  
  2.   
  3. assertEquals(B(10), B(10))  
まぁ、そうだよね。

C に対する以下のテストは通りません
  1. assertEquals(C(arrayOf(A("hoge")), B(10)), C(arrayOf(A("hoge")), B(10)))  
data class がいい感じにやってくれるのかと思っていたのよ。やってくれなかった。

警告が出るのはそういうことなのね。



override すればいいんだけど... いけてない
  1. class C(val names: Array<A>, val age: B) {  
  2.     override fun equals(other: Any?): Boolean {  
  3.         if (this === other) return true  
  4.         if (other?.javaClass != javaClass) return false  
  5.   
  6.         other as C  
  7.   
  8.         if (!Arrays.equals(names, other.names)) return false  
  9.         if (age != other.age) return false  
  10.   
  11.         return true  
  12.     }  
  13.   
  14.     override fun hashCode(): Int {  
  15.         var result = Arrays.hashCode(names)  
  16.         result = 31 * result + age.hashCode()  
  17.         return result  
  18.     }  
  19. }  
Array で持つのやめて List にしたらどうかなと思って試したら
  1. data class A(val name: String)  
  2.   
  3. data class B(val age: Int)  
  4.   
  5. data class C(val names: List<A>, val age: B)  
  1. assertEquals(C(listOf(A("hoge")), B(10)), C(listOf(A("hoge")), B(10)))  
通った


結論: Array はダメだが List ならいい感じにやってくれる


0 件のコメント:

コメントを投稿