この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
Object expressions | Try Kotlin
Kotlinで無名クラスをつくってみよう。
Read about object expressions that play the same role in Kotlin as anonymous classes in Java.
Add an object expression that provides a comparator to sort a list in a descending order using java.util.Collections class. In Kotlin you use Kotlin library extensions instead of java.util.Collections, but this example is still a good demonstration of mixing Kotlin and Java code.
import java.util.*
fun getList(): List<Int> {
val arrayList = arrayListOf(1, 5, 2)
Collections.sort(arrayList, object {})
return arrayList
}
狙い
ここで考えて欲しい問題の意図はなんだろうか?
object式をつかうと無名クラスを作ることができます。たとえば、引数の型がinterfaceになっていて、「1回しかつかわないのに、わざわざクラスを作るの面倒だな」というときに便利です。
解答例
import java.util.*
fun getList(): List<Int> {
val arrayList = arrayListOf(1, 5, 2)
Collections.sort(arrayList, object : Comparator<Int> {
override fun compare(x: Int, y: Int) = y - x
})
return arrayList
}
補足
無名クラスの作成なので、継承、実装が必要じゃないときでも使えます。
Object Expressions, Object Declarations and Companion Objects - Kotlin Programming Languageより
fun foo() {
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
}
あとがき
SAM変換でいいのでは?っと思った方、Day12.でまたお会いしましょう。