はじめに
最近は趣味でKotlinとSpringFrameworkを使っています。使ってみたり、言語設計の哲学を知って、Kotlinが好きになりました。Kotlinの良いところやつまづいたところなどを共有していきたいと思います。
よろしくお願いいたします。
データクラスとは
DTOをJavaで書くとと面倒だった実装をKotlinのデータクラスを使うと簡単に実装できるようになります。Javaと比較しつつ、紹介します。
DTOの実装
Javaで実装してみる
苗字と名前を持ったクラスをJavaで作ると以下のようにフィールド・コンストラクタ・ゲッター・toStringメソッド・hashCodeメソッド・equalsメソッドを実装することになると思います。
package com.example.demo; import java.util.Objects; public class Person { private final String firstName; private final String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(firstName, person.firstName) && Objects.equals(lastName, person.lastName); } @Override public int hashCode() { return Objects.hash(firstName, lastName); } @Override public String toString() { return "Person{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } }
Kotlinで実装してみる
KotlinではDTOをデータクラスとして以下のように簡単に実装することができます。Javaのときに実装したtoStringメソッド・hashCodeメソッド・equalsメソッドをデフォルトで実装してくれます。そのため、わざわざ実装しなくてすみます。
data class Person(val lastName: String, val firstName: String)
他にもcopyメソッドやcomponentNメソッドが使えるようになります。
copyメソッド
copyメソッドとは、インスタンスのフィールドの一部だけを変更して新しいインスタンスを作るときに便利なメソッドです。
firstNameはそのまま流用し、lastNameだけを変更したい場合は以下のように記述することができます。
fun main(args: Array<String>) { val person = Person("カサレアル", "太郎").copy(firstName = "花子") println(person) }
Person(lastName=カサレアル, firstName=花子)
componentNメソッド
N番目のプロパティの内容を取り出す関数です。データクラスだけにある機能ではないですが、componentNメソッドがデフォルトで実装されます。componentNが実装されていると分解宣言ができます。分解宣言については別の機会に説明します。
fun main(args: Array<String>) { val person = Person("カサレアル", "太郎") // component1メソッドは1番目に宣言したフィールドであるlastNameが取得できる // component2メソッドは2番目に宣言したフィールドであるfirstNameが取得できる println(person.component1()) println(person.component2()) // lastNameには1番目に宣言したフィールドであるlastNameが代入される // firstNameには2番目に宣言したフィールドであるfirstNameが代入される val (lastName, firstName) = person println(lastName) println(firstName) }
カサレアル 太郎 カサレアル 太郎
まとめ
JavaではIDEの自動生成やLombokを利用していましたが、Kotlinではデータクラスを使うだけで済むので便利ですね。