Java の Thread 処理を Kotlin に書き換え

# 概要
* [増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88-Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E7%B7%A8-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797331623/ref=sr_1_1?ie=UTF8&qid=1501989967&sr=8-1&keywords=java+%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89)の java コードを　Kotlin に書き換えてみたときのまとめ
* スレッドのデザインパターンは割愛

# コード

## Java
著作権で保護されているため、参考書をご購入ください。

## Kotlin
https://github.com/amaoM/kotlin/tree/master/thread

# 環境構築
- java 1.8
- kotlinc-jvm 1.1.3-2
- STS

Atom と STS で試したが、自動補完やビルドのしやすさから STS を採用

## Atom
- [language-kotlin](https://atom.io/packages/language-kotlin)

2017.8.6現在、自動補完、ビルド用のデファクトプラグインは見当たらない

## STS
http://qiita.com/TAC_yacht/items/1dac48c4703dd9401e9a

# 書き換えポイント

## 基本文法
[公式ドキュメント](https://kotlinlang.org/docs/reference/)の *Getting Started*, *Basics*, *Classes and Objects*, *Functions and Lambda* あたりを一通り読めば把握できる。

## 関数やオブジェクトメソッド
Java の関数やオブジェクトを Kotlin ではどう書くかを調べるのが結構大変。特にオンジェクトメソッドはエディタに自動補完機能があれば一覧で確認できるので探しやすい。基本は [Kotlin Standard Library](https://kotlinlang.org/api/latest/jvm/stdlib/index.html) で探す。ドキュメントから見つけるのが難しい場合は Github の [Kotlin コード](https://github.com/search?utf8=%E2%9C%93&q=language%3AKotlin&type=Repositories&ref=advsearch&l=Kotlin&l=) も参考になる。

## Null 安全
Null になる可能性のある変数が適切に処理されているかをコンパイル時にチェックしてくれることで、プログラム実行時に `NullPointerException` が発生しないこと。`?`記述自体やこれを使うことが Null 安全ではない。

## インスタンス変数の初期化
Null 安全に関連しているが、インスタンス変数は宣言時、もしくはコンストラクタで初期値必須

```kotlin
// Property must be initialized or be abstract
class A {
    val s: String
}

// 宣言時
class A {
    val s: String = "kotlin"
    ...
}

// コンストラクタ
class A {
    val s: String

    init {
        s = "kotlin"
    }
}

// コンストラクタで引数
class A(s: String) {
    val s: String

    init {
        s = s
    }
}
```

## Synchronized

方法は次の2種類

* [synchronized](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html)
* [Synchronized](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized/)

`wait`、`notify`、`notifyAll` を使う場合、`@Synchronized` アノテーションは `lock` 引数を渡せないので、`(this as java.lang.Object).wait()/notifyAll()` とする必要があるが、この書き方は[非推奨](https://kotlinlang.org/docs/reference/java-interop.html#waitnotify)。
`synchronized()`を使って、インスタンス変数として宣言した`java.lang.Object`を引数から受け取れば警告にならないが、これが適切な書き方かどうかは不明。

```kotlin
// @Synchronized
class A {
    @Synchronized
    fun f() {
        (this as java.lang.Object).wait() // This class shouldn't be used in Kotlin. Use kotlin.Any instead.
    }
}

// synchronized()
class A {
    val lock = java.lang.Object()

    fun f() {
        synchronized(lock) {
            lock.wait()
        }
    }
}
```

# まとめ
* 記述が簡潔なため、スクリプト言語出身者でも書きやすい
* Java ハイブリッドになるところが Java 初心者からは難しいところもある
* java から Kotlin に移行したコードサンプルがもっと欲しい

# Kotlin 関連リンク
* [Kotlin is Awesome!](https://kotlin.link/)
* [Github JetBrains/kotlin](https://github.com/jetbrains/kotlin)

# 参考リンク
* http://qiita.com/chkkchy/items/3a4594645b3aef7a98b7
* http://taro.hatenablog.jp/entry/2013/08/01/223323
* http://qiita.com/koher/items/e4835bd429b88809ab33
* https://github.com/jiangyang5157/sudoku-android/blob/56d5681a9be6cf13c0cfc965c20a58f9db954d56/app/src/main/java/com/gmail/jiangyang5157/sudoku/render/RenderThread.kt
* http://qiita.com/omochimetaru/items/ee29d4c6eb0d78f02b15