[毎日Kotlin] Day11. Object expressions(オブジェクト式)

2018.01.26

この記事は公開されてから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.でまたお会いしましょう。