より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

AndroidもサーバーサイドプログラミングもできるKotlinに挑戦

KotlinはAndroidのプログラミングも出来るだけでなく、サーバーサイドプログラミングも出来る言語です。

create-something.hatenadiary.jp

最近の言語としてはAndroidという専門分野がありながらも、サーバーサイドプログラミングも出来るのでストライクゾーンが広い言語なのかなーとは思います。

www.slideshare.net

上記のスライドでは、Scalaとの違いにも触れられています。

学習環境

下記サイトのサンプルコードを手元で動かしながら進めました。

Reference - Kotlin Programming Language

エディタは以下のオンラインエディタを使いました。

play.kotlinlang.org

REPLではないため、main関数を実装する必要があります。

REPLの方がコードを書く量が減って楽なので、Repl.it - Online Kotlin (beta) Editor and IDE - Fast, Powerful, Freeも試してみたのですが、実行時に待たされます。

私があまり国産のPaizaを使わないのもこの実行時の待ち時間なんですよねぇ。

実行はCtrl+F9がショートカットキーとなります。

言語を触ってみての感想

文末のセミコロンは不要だったり、代入だけされて使われていない変数でコンパイルエラーを出したり、と私がKotlinに感じるのは「割り切り」の考え方です。

Null安全型

C#でもなんとか取り入れようとしている仕組み。オブジェクトにはnullを代入することができません。nullが入れるのであれば?をつける必要があります。

fun main() {
    var a:String = "a"
    var b:String? = null
    b = "b"
    println(a)
    println(b)
}

クラスインスタンスにnew修飾子がいらない

確かに、いらないったらいらないですよね。この割り切り。

class TestClass {
    fun method():Int {
        return 4
    }
}

fun main() {
    val a = TestClass()
    println(a.method())
}

Enum

Enum周りの仕組みは私は好きです。私はenumを多用する傾向があるので。

enum class Direction {
    NORTH {
        override fun getJapaneseName() = "北"
    },
    SOUTH {
        override fun getJapaneseName() = "南"
    },
    EAST {
        override fun getJapaneseName() = "東"
    },
    WEST {
        override fun getJapaneseName() = "西"
    };    
    abstract fun getJapaneseName() : String
}

fun main() {
    for (i in Direction.values()) {
        println(i.getJapaneseName())
    }
}

Enumに関数を持たせたくなることがしばしばあります。

無敵の言語?

様々な言語のIDEを開発してきたJetbrainsの開発した言語ですし、物足りなさは言い出したらキリがないとしても割りかしスキのない言語だと感じてました。

そうでもないようです。

下記の記事では結論としてはJavaよりは遥かに優れた言語と述べながらも課題についても列挙しています。

dev.to

  • static修飾子が存在しないため、クラス関数の宣言が煩雑
  • classに修飾子がない場合はfinalなので、openキーワード宣言が必要
  • コンストラクタ宣言方法が複数あってわかりづらくなっている
  • dataクラスは素晴らしいコンセプトだが、継承ができない。
  • キーワードが多すぎて、学ぶのに2日では足りない。

staticは残念ですね。なぜでしょう。

language design - Why is there no static keyword in Kotlin? - Software Engineering Stack Exchange

ふむ。Scalaもだけど、シングルトンオブジェクトで代用出来て、そうすることで全てをObjectとして表現できるから。

ということですか。

個人的には、Oracleが握っているJavaを拡張したJVM言語なので今後、どんな風に課金されるのかが心配です。