[日本語訳] Kotlin 1.1 is also for Android Developers

# はじめに
これは2017/04/05に公開された[**Kotlin 1.1 is also for Android Developers**](https://blog.jetbrains.com/kotlin/2017/04/kotlin-1-1-is-also-for-android-developers/)の日本語訳エントリとなります。
ショボい英語力と足りないKotlin力を使って書きましたので、変なところが散見するかと思いますが、
**大目に見る/優しくご指摘いただければ幸いですｍｍ**

ーーー 修正履歴 ーーー
- 2017/05/11 02:02: 原文へのリンクを追加。ソースを一箇所修正。(@jollyjoester様より)
ーーーーーーーーーーー

# 日本語訳ここから
Kotlin 1.1リリースktkr。このリリースに含まれる新しい機能はJavaで開発するエンジニアにとって非常に有用なだけでなく、
JVMを新しい可能性の世界へといざないます。

しかし[coroutines](https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md)や[type aliases](https://github.com/Kotlin/KEEP/blob/master/proposals/type-aliases.md)のような機能のなかには、Android開発者にとってSF(Science Fiction)にも見えるものがあります。

Kotlinはどのようなプラットフォームでも開発者がほとんど気にしなくても良い方法で少しづず改善するため、未だにJava6で立ち往生しています。

なのでこのような質問があるでしょう: 「今回の新機能を有効にしたままJava6との互換性は保てる？」
そして答えはこうです: 「もちろんさ！」

**すべての新機能はJava6でも、そしてAndroid開発者も利用可能です。**
そして今日その中の幾つかを、Androidアプリを作るときにどのように使えるのかをお見せしたいと思います。

## Type aliases: 自作のリスナをより読みやすくすることが出来ます
もちろん`type aliases`は様々な利用法がありますが、一番最初に脳裏によぎったのはlambdaを利用しながらもリスナの可読性を向上させることが出来る能力です。

もし`type aliases`というワードが初耳であれば、これは基本的に複雑な`型`により読みやすい名前を与えるものと捉えていただければと思います。

例えば、listenerを受け取る`RecyclerView.Adapter`の拡張クラスを作ることを考えます。
ご存知の通り、`RecyclerView`はリストのアイテムクリックを扱う標準(`ListView`が持っているような)の方法を持っていません。
そのため、自分で用意する必要があります。

`view`にアクセス出来るlistenerが必要なことを考えると、`Adapter`クラスは以下のようにできます。

```
class MyAdapter(val items: List<Item>, val listener: (View) -> Unit) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    ...
}
```

そして`ViewHolder`はその`listener`を、`view`のclick listenerにアサインするために必要とするでしょう。
(以下のようにできます)

```
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(item: Item, listener: (View) -> Unit) {
        itemView.setOnClickListener(listener)
    }
}
```

これはそれほど複雑な例ではありませんが、例に見られるように`lambda`を繰り返す必要があり、これは読みづらさを招く可能性があります。
(```(View) -> Unit)```こういう部分ですね)

このことに対して、`click listener`を意味する`type alias`を定義することができ、
```typealias ClickListener = (View) -> Unit```
これを用いて`listener`を使う部分を以下のように置換することができます。
```class MyAdapter(val items: List<Item>, val listener: ClickListener)```
```fun bind(item: Item, listener: ClickListener) { ... }```

## Data classes: より強力になりました
`Data class`は大量の雛形が出来上がってしまうのを避けることができるすごいものですが、
いくつかの力不足のために不便になってしまうケースがあります。

Kotlin 1.1の新機能の1つが継承に関するものです。
`Data class`が他のクラスを継承できるようになりました。
これは`data class`が`sealed class`の一部になることを許容します。

```
sealed class UiOp {
    object Show : UiOp()
    object Hide : UiOp()
    data class Translate(val axis: Axis, val amount: Int): UiOp()
}
```
(Kotlin 1.0等で`data class`を他のクラスを継承して定義しようとすると、
```Data class inheritance from other classes is forbidden```と怒られます。)

さらに、**sealed classのサブクラスが親クラスの外で定義できるようになったため**、次のようにも書けるようになりました。
(参考: https://kotlinlang.org/docs/reference/sealed-classes.html)

```
sealed class UiOp
object Show : UiOp()
object Hide : UiOp()
data class Translate(val axis: Axis, val amount: Int)
```

## lambda内でのdata classのデストラクション
`Data class`は自動生成される`componentX()`メソッドのお陰でkotlin創生の時代からデストラクションすることができ、
次のようにして`data class`のデータを変数に分解することができました。

```
data class Item(val text: String, val url: String)

val (text, url) = item
```

しかし、lambda内で同じことをするという本当に強力な機能がかけていました。
もう待たなくていいんだよ！今はこんなふうにできます。

```
fun bind(item: Item) = item.let { (text, url) ->
    textView.text = text
    imageView.loadUrl(url)
}
```
これは例えば`Pairs`や、`Map`でのkey/valueセットを使う際にとても役立ちます。

## ローカルで移譲されたプロパティ
移譲されたプロパティはクラスのプロパティに追加の機能をもたせるのに非常に便利であることが証明されています。

例えば、最も便利なものの1つに、プロパティ割当の実行をそのプロパティが最初に使われる時点まで延期する**lazy delegation**が挙げられます。

これはローカル変数に関しても役立つはずですが、Kotlinではその機能はありませんでした。

Kotlin 1.1では、ローカル変数に関しても次のように`lazy`などの移譲を使うことができます。

```
fun testLocalDelegation() {
    val database by lazy { createDatabase() }
    val cache by lazy { createMemoryCache() }

    if (mustUseDatabase()) {
        database.use { ... }
    } else {
        cache.use { ... }
    }
}
```
この例は`lazy`がなくても実現できますが、コンセプトの理解には役立ちます。

もしあるメソッドが使われるかもしれないし使われないかもしれない1組の巨大なオブジェクトを保持するとします。
`lazy`を用いることによって、それを本当に使われる時が来るまで延期することができます。
(使われなかった時、無駄に巨大なオブジェクトを持ってしまうことを避けられます)

## もうlambda内で使わない変数を宣言しなくて良くなります
lambda内で、最後まで使われない変数であっても引数として宣言しなければならならないのはもはや一般的なことでした。

Kotlin 1.0では使わない変数を破棄する方法がなかったからです。

例として、[この記事](https://antonioleiva.com/recyclerview-diffutil-kotlin/)で`RecyclerView`を移譲を利用して更新する方法を紹介した際、
以下のようにしました。

```
var items: List<Content> by Delegates.observable(emptyList()) {
    prop, old, new ->
    autoNotify(old, new) { o, n -> o.id == n.id }
}
```

今までは変数`prop`は1度も使われていませんが宣言する必要がありました。
Kotlin 1.1では`_(アンダースコア)`を使って宣言を避けることができます。

```
var items: List<Content> by Delegates.observable(emptyList()) {
    _, old, new ->
    autoNotify(old, new) { o, n -> o.id == n.id }
}
```
しかしこれは、どの引数も使わない場合はまだイマイチよくありません。
もしlambdaの引数が1つ以上ある場合、どれも使わないにもかかわらず全ての引数について記述する必要があります。

```
var items: List<Item> by Delegates.observable(emptyList()) {
    _, _, _ ->
    notifyDataSetChanged()
}
```

これは変数定義をより少なくするだけでなく、コードがより読みやすくなります。
もうこれからは、その変数が使われているのかいないのか調べる必要はなく、使われていないことがはっきりします。

## Coroutines
`Coroutines`はKotlin 1.1で最も興奮するニュースです。このリリースでは"**実験的**"とは言われているものの、
**それらは完全に機能しており、今からでもあなたのプロジェクトで利用することができます。**

`Coroutines`は非同期なコードを同期的に書くことができ、逐次的に書いているにも関わらず後続処理を保留して結果を待つことができます。
(async-await)

Kotlinの`Coroutines`について既にご存知であろう1つは、これはライブラリや特定の実装ではなく**言語仕様でありCoroutinesを利用してライブラリを作ることが出来る**ということです。

なので、最終的なコードとしてはあまり変わらないとしても、何が*サブスレッドを作っている歯車で、メインスレッドに返却している*歯車なのかを理解することはAndroidではとても重要になります。

幸運なことに、Kotlinのコミュニティは非常に活発に活動しており、既に**いくつかのライブラリがCoroutinesの力をAndroidに提供しています**。
いくつか例を上げておきます。

- まず最初に見ておきたいであろうJetBrainsによって提供されている公式ライブラリです
	- [kotlinx-coroutines-android](https://github.com/Kotlin/kotlinx.coroutines/tree/master/ui/kotlinx-coroutines-android): Androidで`Coroutines`を利用するための実装を提供
	- [Anko](https://github.com/Kotlin/anko): 最新betaから多くのframeworkのlistenerをサポートするための`Coroutines`を提供
- 独自の`Coroutines`を実装し提供しているサードパーティライブラリも存在します
	- [AsyncAwait-Android by Niek Haarman](https://github.com/nhaarman/AsyncAwait-Android)
	- [Async / Await by Metalab](https://github.com/metalabdesign/AsyncAwait)
	- [kotlin-coroutines-retrofit by Andrey Mischenko](https://github.com/gildor/kotlin-coroutines-retrofit): Retrofitをサポートしたい場合はこちら

これらを使うだけでなく、これらがどのように実装されているのかを確認してみることを強くおすすめします。
それがオープンソースの魔法です。

## Android開発でのその他のクールなやつら
今回のリリースにはもっと多くの改善が含まれていますが、ここではAndroid開発にフォーカスしてご紹介したいと思います。

まず最初に、```jackOptions { true }```を用いたJack compilerのサポートです。Googleは`Jack toolchain`を非推奨として公表していますが、Java8のために利用している場合、Jack toolchainはAndroid 2.4のリリースまでは有用に使うことができるでしょう。
(実際にはAndroid Studio 2.4 Preview 4以降ではJackが廃止され、新しい方法でJava 8の言語機能がサポートされているようです［[参考](http://qiita.com/kamimoo/items/e0a07f3589086f5e4e2a)］)

さらに、**カスタムViewのコンストラクタを実装するための@JvmOverloadsを使う新しいintention**もあります。
これは、カスタムViewのコンストラクタを引数のデフォルト値を利用して一行で書けるようにするためのものです。(*少々長い*一行ですが^^;)

```
class CustomView @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    ...
}
```
この`@JvmOverloads`ですが、調べてみると2015年には既に使えていた機能らしいです。
特に目新しいものでもなさそうなので、あくまで便利な機能を紹介するために書いているということですかね？［[参考](http://qiita.com/jmatsu/items/6c141ba0acb13409c7bf)］

## まとめ
Kotlin 1.1はなんでまだJavaを使い続けてるの？というもっともな疑問を投げかけるほど素晴らしい機能を多くもたらしました。

KotlinがAndroid開発者にもたらした疑いの余地がなく、今日からでもAndroidアプリをKotlinで書き始めることができます。

そしてAndroidアプリを1からKotlinで作る方法を学びたいのであれば、[興味をもてる本](https://antonioleiva.com/kotlin-android-developers-book/)を見つけることでしょう。

# 日本語訳ここまで
# おわりに
`async-await`を実現できる`Coroutines`素敵ですね。
`Node.js`などでは既に使えていただけに、遂に来たかという感じです。

以上となります。
**Kotlinかわいい**