Kotlin データクラス

はじめに

最近は趣味で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ではデータクラスを使うだけで済むので便利ですね。


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。