Kotlin で Value Object を作るときに data class を使っていたが、 inline class が使えるのではないかという話があったので調べてみようと思います。
まず、今回は data class を Java コードから学んでみます。
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 を見てみましょう。
それでは、また。