About

本サイトについて

趣味で開発したプログラムや開発メモを載せています。
ソースコードはGithubで公開しつつ、なるべく後から分かるように解説に努めてますので、
誰かのお役に立てれば嬉しいです。

プロフィール

kght6123

佐賀県出身で1985年生まれ。
三重県四日市市在住のシステムエンジニア。家庭を大事にしたい2児の父。

kght6123.page

2年間使ってないKotlinを思いだしたい!

2020-11-30T22:25:08.200Z

KotlinでAndroidアプリ作ったり、Ktor触ったりしてたので思いだしたい!

昔(2年ぐらい前に)、よく使っていたKotlinとJavaの記法をすっかり忘れているので

どちらも効率よく思いだすために、よく使っていたJavaとKotlinの記法をいろいろ比べてみました!

(ついでに、昔、触っていたKotlinやKtorの現状、今はやっているっぽいフレームワークをまとめてみました!)

JavaとKotlinが少しわからないと読めないかも。よろしければ、参考まで・・・

定数と変数

Kotlinは、変数の宣言時にvarと書くと変数、valと書くと定数になり記述量が少ないです。

Javaのように、毎回毎回、定数にするときにfinalと書かなくてよいです。

Null安全

Kotlinの場合

Kotlinは、変数の宣言時にnullが入る可能性があるか?を予め決めておくことで

その変数の参照時にはnullチェックを強制(nullチェックがないとコンパイルエラーになる)して、

極力、NullPointerExceptionを起こさないようにコーディングすることができます。

val value: String?          // nullの代入が可能
val value: String = "hello" // nullの代入が不可能(宣言時に、何らかの値を代入する必要がある)

さらに、nullチェックと関数の呼び出しを簡単に記述することができます。

value?.let(this::add) // valueがnullならば、letを呼び出さない

Javaの場合

一応、Javaでもjava.util.Optionalを使うことで、null安全に参照できますが

Kotlinのような手軽さはありません。

public Optional<String> getValue() {
    //
    // nullの可能性をOptionalでラップする
    //
    //  -> 空:「Optional.empty()」
    //  -> nullの可能性有:「Optional.ofNullable()」
    //  -> nullの可能性無:「Optional.of()」
    //
    return Optional.ofNullable(value);
}
// null以外のとき、addメソッドが呼ばれる
getValue().ifPresent(this::add);

クラスとコンストラクタの書き方

Kotlinの場合

Javaと違って、ファイル名とクラス名を合わせる必要はないです

関数のように引数のデフォルト値が設定できる

class Hello(val value: String?, val text: String?) {

親クラス(例だと、World)への引数は下記のように書く

class Hello(val value: String?, val text: String?) : World(text) {

もし、複数のコンストラクタが必要な場合は、下記のように書く

class Hello {
    constructor(val value: String?, val text: String?) {
        // 一つ目
    }
    constructor(val hello: Hello) {
        // 二つ目
    }
}

Javaの場合

public class Hello {
    private final String value;
    private final String text;

    public Hello(final String value, final String text) {
        super();
        this.value = value;
        this.text = text;
    }

    public Hello(final Hello hello) {
        super();
        this.value = hello.value;
        this.text = hello.text;
    }

内部クラス

Javaはクラスの中に、内部クラスが書ける。内部クラスはstaticにすることもできる。

public class Main {

    public static class Hello {

クラス変数の初期化の遅延(Kotlinのみ)

Kotlinは、後からクラス変数の初期化をしてもnot nullで行うことができます。

Kotlinはnot null変数(?なし)の宣言時に、何らかの値を代入する必要がありますが、

lateinitを使うと代入を遅らせつつ、not nullな初期化済みの変数としてアクセスできます。

(初期化がされていないと、コンパイルエラーになります!)

class Hello {
    lateinit var afterInitValue : String

    fun init(): Hello {
        afterInitValue = "Init!!!"
        return this
    }
}

作成中・・・