アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

新規のAndroidプロジェクトでKotlinを採用してみた結果

この記事はアクトインディ Advent Calendar 2016 22日目の記事になります。

現在、アクトインディではAndroid開発にKotlinを採用しています。
今回はKotlinを採用した経緯と採用後の感想を簡単にまとめたいと思います。

なぜ、Kotlinを採用したか?

単純にKotlinで書きたかった(興味、期待があった)から

正直これが一番大きかった気がします。
チームポリシーとして明言しているわけではないのですが、今のチームメンバーは「作っている人が如何にモチベーションを保って開発出来るか?」を大切にしている感があります。
あと、新規アプリだったこともあり、Kotlinを導入する障壁はありませんでした。
Javaよりも気持ちよくコードが書けそうという期待もありました。

Javaと併用可能

万が一、「Kotlinはちょっと駄目かも・・・」となってもJavaにシフト出来るので気持ち的に安心感がありました。

Swiftと似ている

Androidアプリ開発が始まる前、iOSアプリ開発をしていました。
iOSアプリ開発も新規アプリ開発だったので、100%Swiftで開発を行っていました。
開発メンバーもSwift開発者がAndroid開発も兼任していたので、JavaよりもKotlinのほうが言語習得のコストは少なくなりそうだなと考えました。
あとはNull安全が大きな採用要素でした。

実際のところどうだったか?

学習コストは低かった(感覚値)

他の言語と比較してどうだった?という風には言えないのですが、感覚値では学習で手こずった感はあまりありませんでした。
SwiftからKotlinと言語が変わっての障壁もすくなかったように思います。

導入が楽

Android StudioのKotlin用のプラグインが入っているのでJavaで書かれたプロジェクトをKotlinのプロジェクトに簡単に変換出来ます。また、アクティビティクラスなど追加する場合でも最初からKotlinコードで生成することが出来ます。

書いてて楽しい

個人的に「書いてて楽しい」の助けになっている要素の一部分をすごく簡単ですがまとめました。

・データクラス

data class SampleDataClass(val sampleVal1: Int, val sampleVal2: String)

一行で書けます。

・拡張関数

fun String.sampleExtensionFun(): String {
    // 処理
}

既存のクラスに対して関数を生やすことが出来ます。

型推論

val sampleVar = 0

いちいち、型定義しなくても変数定義時に値を設定することで型が決定します。
が、最近Kotlin採用しているプロダクトでビルド時間が長くなってる感があるので、型推論と型を明示的に宣言している場合にどれくらいビルド時間が違うのか検証してみたいですね。

・if式

class SampleClass {
    fun sampleFun(score: Int): String {
        return if (score >= 30) "合格" else "赤点"
    }
}

ifは式です。なので上記の様にif分岐の結果をreturnとして返すことが出来ます。

・when式

class SampleClass {
    fun sampleFun(score: Int): String {
        return when(score) {
            1 -> "one"
            2 -> "two"
            3 -> "three"
            else -> "other"
        }
    }
}

when(Javaでいうところのswitch)は式です。なので上記の様にwhereの結果をreturnとして返すことが出来ます。

・名前付き引数とデフォルト引数

fun sampleFun(sampleArg: Int = 0) {
    // 処理
}
sampleFun(sampleArg = 1)

関数/メソッド呼び出し時に引数を指定出来ることでコードが明確になります。
デフォルト値を設定することで引数を省略することも出来ます。

ラムダ式

fun main(args: Array<String>) {
    val sampleClass = SampleClass()
    sampleClass.sampleFun {
        print("callback")
    }
}

class SampleClass {
    fun sampleFun(callback: (() -> Unit)) {
        callback.invoke()
    }
}

ラムダを使って、簡単にコールバックなどを定義することが出来ます。

・Null安全

fun main(args: Array<String>) {
    val sampleClass = SampleClass()
    sampleClass.sampleVar = "0"
    print(sampleClass.sampleVar1.toInt())  // エラー
    print(sampleClass.sampleVar1?.toInt()) // 安全呼び出し(?)をつけることで正常に動作します
}

class SampleClass {
    var sampleVar1: String? = null // Nullableな定義
    var sampleVar2: Int = 0 // NonNullな定義
}

Kotlinは言語的にNullPointerExceptionが発生しそうなところ変数参照などのコードで静的に警告が出て、Compileも出来ない様になっています。 これだけでだいぶ安心してコードを書くことが出来ます。 また、データ表現としてNonNullで定義するか?Nullableで定義するか?を意識出来る様になってきます。 メンバー間で議論することもあり、有意義なコードを書ける様になっていきます。

エルビス演算子(?:)

class SampleClass {
    fun sampleFun() {
        val sampleVal = huge() ?: return
        // 処理
    }
}

エルビス演算子を使って、hoge()の戻り値がnullだった場合は上記の処理でreturnすることが出来ます。

・などなど・・・

Kotlinにはコードを早く楽しく書くための機能が言語的に備わっていたり、シンタックスが簡潔です。
なのでプロダクトに必要な本質的な実装に集中することが出来ます。

まとめ

足早なKotlinの紹介でしたが、1からAndroidアプリを作るときに開発言語でKotlinを使ってみることをおすすめします。
Kotlinはいいぞ。

最後に

KotlinでAndroidアプリ作りたい!アクトインディにジョインしていこーよを開発をしたい!方はこちらまで!