GoogleI/O 2017でAndroidがKotlinを正式サポート声明出してたけど恐れるものではない

つい先日行われたGoogleI/O 2017で、AndroidがKotlinを公式にサポートする声明を出していた。 具体的にはAndroidStudio3.0から何もせず使えるということなので、3.0からKotlinプラグインが含まれる形で配布されると推測。

その関連でQiitaではKotlin入門の記事が急激にいいね付いてたり、TwitterではKotlinに対する不安をちらほら見かけた。 新しい言語をサポートするということで驚いているエンジニアが多い印象。 でもKotlinを使ってる身からするとそんなに身構えなくてもいいのになという感想を持ったので、少しKotlinがどんなものなのかを振り返ってみる。

KotlinはJava

Twitter上でKotlinが導入されたらJavaは使えなくなる?的なツイートを見たけど、そんなことはない。 KotlinとJavaは共存できるのでどちらか片方を選んだらもう片方は使えなくなるといったことはない。 むしろKotlinはビルド時にJavaのコードに変換される。 DroidKaigi2017でトクバイの八木さんが講演していたので参考までに。

speakerdeck.com

JavaでもKotlinと同等のコードは書ける。ただめんどい。

上記で説明したとおりKotlinはJavaに変換される。つまり逆の話をするとJavaでもKotlinのコードに相当するものを書ける。 でもコード量が多くなりがちで面倒。例えば以下のJavaUserクラスとKotlinUserクラスはビルド時も実行時も同じ挙動をするがコード量がだいぶ増減している。 概ねfinal宣言の簡略化とgetter/setterの自動生成、プライマリコンストラクタのお陰でKotlinはコード削減している。

public class JavaUser {
    private final String userId;

    public JavaUser(@NotNull String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }
}
class KotlinUser(val userId: String)

JavaっぽくKotlinを書いてもいい

Kotlinは言語なのでJavaと記法が違うところがある。特に上のコードを見てプライマリコンストラクタってなんだよ…って思う人も居ると思う。 初期の頃私も思ってたし、書き方合わないと思ってた。 そういう所はJavaっぽく書いても良いと思う。 例えばプライマリコンストラクタはセカンダリコンストラクタを用いることでJavaっぽく書ける。

class KotlinUser {

    val userId: String
    
    constructor(userId: String) {
        this.userId = userId
    }
}

コード量は増えるもののJavaに慣れてるなら上記コードでもいいと思う。 Kotlinの本質は、NullPointerExceptionの激減finalフィールドの書きやすさあたりだと思っているので本質のメリットさえ享受できていれば慣れるまでJavaぽく書いてもいいと思う。

Javaと共存

最初のほうでも書いたがKotlinはJavaなのでJavaと共存可能。 KotlinからJavaのコードを呼べるし、JavaからKotlinのコードを呼べる。 SwiftのようなBridging-Header.hなど設定ファイルは必要ない。

むしろJavaで書いてもいい

Kotlinの一部記法が良くわからず、一部Javaで書きたい人も居ると思う。 Java書いてもいいと思う。100%Kotlinにする必要はないと思う。

そして、Kotlinを勉強してみてもJavaがやっぱりいいと思う人は、Javaで書いてもいいと思う。 エンジニアにも好みがあるし、一番速く一番品質良く書ける言語で書くのが一番だと思う。

やっぱりKotlinをおすすめしたい

上でJavaで書いてもいいとしたが、でもKotlinで書けるならKotlinで書いたほうが良いとは思う。 最近仕事でJava100%で書かれたAndroidアプリを引き継いだのだが、NullPointerExceptionでのクラッシュレポートが多いので、Kotlin導入出来ていれば大部分は防げたんじゃないかという思いが強くある。 Kotlinは強くおすすめしたい。