dskst's diary

Life and Tech Blog

Kotlin / data class を Java コードから学ぶ

Kotlin で Value Object を作るときに data class を使っていたが、 inline class が使えるのではないかという話があったので調べてみようと思います。

まず、今回は data class を Java コードから学んでみます。

f:id:dskst9:20190310230649p:plain

Value Object を例に学ぶ

シンプルに FirstName を持つだけの Value Object を定義してみました。

Java

Java のコードです。

factory で firstName を引数にオブジェクトを生成します。あとは getter があるだけというシンプルなプログラムです。

public class FirstName {

    private String firstName;

    private FirstName(String firstName) {
        this.firstName = firstName;
    }

    public static FirstName of(String firstName) {
        return new FirstName(firstName);
    }

    public String getFirstName() {
        return firstName;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        FirstName firstName1 = (FirstName) o;

        return firstName.equals(firstName1.firstName);
    }

    @Override
    public int hashCode() {
        return firstName.hashCode();
    }
}

Kotlin

Kotlin です。

特に factory もいらないのでたったの一行になってしまいました。

data class FirstName(val firstName: String)

Kotlin to Java

さて、 Kotlin のソースを Java で見てみましょう。
(Metadata は除外しています)

public final class FirstName {
    @NotNull
    private final String firstName;

    @NotNull
    public final String getFirstName() {
        return this.firstName;
    }

    public FirstName(@NotNull String firstName) {
        Intrinsics.checkParameterIsNotNull(firstName, "firstName");
        super();
        this.firstName = firstName;
    }

    @NotNull
    public final String component1() {
        return this.firstName;
    }

    @NotNull
    public final FirstName copy(@NotNull String firstName) {
        Intrinsics.checkParameterIsNotNull(firstName, "firstName");
        return new FirstName(firstName);
    }

    // $FF: synthetic method
    @NotNull
    public static FirstName copy$default(FirstName var0, String var1, int var2, Object var3) {
        if ((var2 & 1) != 0) {
            var1 = var0.firstName;
        }

        return var0.copy(var1);
    }

    @NotNull
    public String toString() {
        return "FirstName(firstName=" + this.firstName + ")";
    }

    public int hashCode() {
        return this.firstName != null ? this.firstName.hashCode() : 0;
    }

    public boolean equals(@Nullable Object var1) {
        if (this != var1) {
            if (var1 instanceof FirstName) {
                FirstName var2 = (FirstName)var1;
                if (Intrinsics.areEqual(this.firstName, var2.firstName)) {
                    return true;
                }
            }

            return false;
        } else {
            return true;
        }
    }
}

toString, hashCode, equals などが生成されています。NotNull まで定義してくれます。
1行書いただけなのにすごいですね。

data class 詳細な説明は公式 データクラス - Kotlin Programming Language をご覧ください。

次回、 inline class を見てみましょう。
それでは、また。