概要
- 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編の java コードを Kotlin に書き換えてみたときのまとめ
- スレッドのデザインパターンは割愛
コード
Java
著作権で保護されているため、参考書をご購入ください。
Kotlin
環境構築
- java 1.8
- kotlinc-jvm 1.1.3-2
- STS
Atom と STS で試したが、自動補完やビルドのしやすさから STS を採用
Atom
2017.8.6現在、自動補完、ビルド用のデファクトプラグインは見当たらない
STS
書き換えポイント
基本文法
公式ドキュメントの Getting Started, Basics, Classes and Objects, Functions and Lambda あたりを一通り読めば把握できる。
関数やオブジェクトメソッド
Java の関数やオブジェクトを Kotlin ではどう書くかを調べるのが結構大変。特にオンジェクトメソッドはエディタに自動補完機能があれば一覧で確認できるので探しやすい。基本は Kotlin Standard Library で探す。ドキュメントから見つけるのが難しい場合は Github の Kotlin コード も参考になる。
Null 安全
Null になる可能性のある変数が適切に処理されているかをコンパイル時にチェックしてくれることで、プログラム実行時に NullPointerException
が発生しないこと。?
記述自体やこれを使うことが Null 安全ではない。
インスタンス変数の初期化
Null 安全に関連しているが、インスタンス変数は宣言時、もしくはコンストラクタで初期値必須
// 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種類
wait
、notify
、notifyAll
を使う場合、@Synchronized
アノテーションは lock
引数を渡せないので、(this as java.lang.Object).wait()/notifyAll()
とする必要があるが、この書き方は非推奨。
synchronized()
を使って、インスタンス変数として宣言したjava.lang.Object
を引数から受け取れば警告にならないが、これが適切な書き方かどうかは不明。
// @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 関連リンク
参考リンク
- 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