これはJavaからKotlinへの移行してみたら、とてもよかったということを伝えるための記事です。
Javaの欠点
私は少し前までJavaでプログラミングをしていました。しかしJavaには欠点があります。これは例えば次のようなものです。
これはJavaからの移行についての記事です。JavaScriptは全く別の言語です。ご注意ください。
NullPointerException
APIから戻り値としてnullが返される場合や引数にnullを渡されたりします。前者についてはJava 8で追加されたOptionalクラスを使うことで回避できますが、後者はどうにもできません。実行時エラーはできますがコンパイルエラーが出ないことは残念なことです。
冗長な記述
型の記述
変数を宣言する場合、List<String> words
など型を記述します。しかし、それを推論できればいいですよね。いまではvar
が使えますが、インスタンスフィールドなどにはそれはできません。
オブジェクト指向について
Javaではいちいちカプセル化をするためにgetter/setterを記述する必要があり、それらは少し冗長です。クラスのコンストラクタ、そしてオーバーロードなど、かなり面倒なものです。
関数型プログラミングについて
Javaでは関数を受け取るメソッド(高階関数)を作成する場合、Functionといった
すこし長い型を記述する必要があります。これは決まった命名規則がありますが、それでも読みにくいです。
移行する点で考慮しなければならないこと
覚えることが少ないこと
言語を移行した時にまったく文法が違っていた場合、それはなじみにくいでしょう。動的付けであったり、関数型プログラミングが中心だったりなどです。
少しづつ移行できること
新しく移行先のプログラミング言語の互換性がまったくなかったりしては、膨大な時間を使います。できればいままでのJavaプログラムを使えてほしいものです。
そうだKotlinだ!
null安全
Kotlinはnullが入れれる型とそうでない型を分けています。String?
はnullが入ることがあります。String
はnullを入れれません。
簡潔な記述
Javaでは、下記のようなクラスを
public class Pen {
private int ink;
public Pen(int ink) {
setInk(ink);
}
public int getInk() {return ink;}
public void setInk(int ink) {
if (ink < 0)
throw new IllegalArgumentException("引数が0以下です。指定値:" + ink);
this.ink = ink;
}
}
Kotlinでは、
class Pen(ink: Int = 0) {
var ink:Int = ink
set(value) {
if (ink < 0)
throw IllegalArgumentException("引数が0以下です。指定値:${value}")
field = value
}
}
とシンプルにかけます。もし、setterにチェックがなければ、
class Pen(var ink:Int)
のみです。getXXX、setXXXという命名規則に従っていれば、pen.ink
のようにフィールドのようにアクセスできます。ちなみにKotlinで先ほど定義したフィールドはコンパイル時にgetter/setterが生成されます。
変数の型は、一緒に初期化すれば:Int
の部分を省略できます。関数型プログラミングに関してはString -> Int
でHaskellのように簡単にかけます。
KotlinはJavaと共存できる
実はKotlinはコンパイルするとclassファイルに変換されます。つまりは、Javaと同じくJVMで走ります。KotlinとJavaは共存でき、KotlinがJavaのライブラリを使用したり、継承したり、その逆をしたりできます。
終わりに
私はIntelliJというIDEを使っています。それは、JavaをKotlinに変換する機能(すでにあるファイルや、コピペ時)がついており、とても助かっております。JVMで走る言語にはScalaやGroovy、Ruby(jRuby)などがありますがRubyなどではあまり構文になじめず、Scalaはコンパイル速度が遅く、Groovyは動的付けという理由でKotlinを選びました。
さぁみなさんもKotlinに移行しに行こう(ダジャレ)。