LoginSignup
9
10

More than 5 years have passed since last update.

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

Posted at

概要

コード

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種類

waitnotifynotifyAll を使う場合、@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 関連リンク

参考リンク

9
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10