Kotlinのデータクラス

1概要

Kotlin言語はデータクラスの概念を導入します。これはデータコンテナとして使用される単純なクラスを表し、追加のロジックをカプセル化しません。簡単に言えば、Kotlinのソリューションは私たちが多くの定型コードを書くことを避けることを可能にします。

この簡単な記事では、Kotlinのデータクラスを見て、それらをJavaの対応するものと比較します。

2コトリン設定

Kotlinプロジェクトの設定を始めるには、 Kotlin言語の紹介 チュートリアルをチェックしてください。

3 Java のデータクラス

Javaで Movie エントリを作成したい場合、多くの定型コードを書く必要があります。

public class Movie {

    private String name;
    private String studio;
    private float rating;

    public Movie(String name, String studio, float rating) {
        this.name = name;
        this.studio = studio;
        this.rating = rating;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStudio() {
        return studio;
    }

    public void setStudio(String studio) {
        this.studio = studio;
    }

    public float getRating() {
        return rating;
    }

    public void setRating(float rating) {
        this.rating = rating;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;

        result = prime **  result + ((name == null) ? 0 : name.hashCode());
        result = prime **  result + Float.floatToIntBits(rating);
        result = prime **  result + ((studio == null) ? 0 : studio.hashCode());

        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;

        if (obj == null)
            return false;

        if (getClass() != obj.getClass())
            return false;

        Movie other = (Movie) obj;

        if (name == null) {
            if (other.name != null)
                return false;

        } else if (!name.equals(other.name))
            return false;

        if (Float.floatToIntBits(rating) != Float.floatToIntBits(other.rating))
            return false;

        if (studio == null) {
            if (other.studio != null)
                return false;

        } else if (!studio.equals(other.studio))
            return false;

        return true;
    }

    @Override
    public String toString() {
        return "Movie[name=" + name + ", studio=" + studio + ", rating=" + rating + "]";
    }
}

86行のコード。単純なクラスには3つのフィールドしか格納できません

4コトリンデータクラス

それでは、Kotlin ** を使って、同じ機能を持つ同じ Movie クラスを作成します。

data class Movie(var name: String, var studio: String, var rating: Float)

ご覧のとおり、これは非常に簡単でクリーンです。コンストラクタ toString()、equals()、hashCode()、 、その他の copy() および componentN() 関数が自動的に生成されます。

4.1. 使用法

データクラスは他のクラスと同じ方法でインスタンス化されます。

val movie = Movie("Whiplash", "Sony Pictures", 8.5F)

現在、のプロパティと機能が利用可能です。

println(movie.name)  //Whiplash
println(movie.studio)//Sony Pictures
println(movie.rating)//8.5

movie.rating = 9F

println(movie.toString())//Movie(name=Whiplash, studio=Sony Pictures, rating=9.0)

4.2. コピー機能

copy() 関数が作成されました。オブジェクトをコピーしてそのプロパティの一部を変更する必要があるが、残りは変更されないようにするためです。

val betterRating = movie.copy(rating = 9.5F)
println(betterRating.toString())//Movie(name=Whiplash, studio=Sony Pictures, rating=9.5)

Javaは、オブジェクトをコピーまたは複製するための明確でネイティブな方法を提供していません。 Clonable インターフェース、 SerializationUtils.clone() 、または cloningコンストラクター を使用できます。

4.3. 構造の宣言

非構造化宣言を使用すると、オブジェクトのプロパティを個別の値として扱うことができます。 outデータクラスの各プロパティに対して、 componentN() が生成されます。

movie.component1()//name
movie.component2()//studio
movie.component3()//rating

オブジェクトから、または関数から直接複数の変数を作成することもできます。括弧の使用について覚えておくことが重要です。

val(name, studio, rating) = movie

fun getMovieInfo() = movie
val(namef, studiof, ratingf) = getMovieInfo()

4.4. データクラスの要件

データクラスを作成するには、以下の要件を満たす必要があります。

  • プライマリコンストラクタは少なくとも1つのパラメータを持つ必要があります

  • すべてのプライマリコンストラクタパラメータは、 val または var としてマークする必要があります。

  • データクラスは抽象、オープン、シール、または内部にはできません

  • (1.1より前)データクラスはインターフェースしか実装できない

1.1以降、データクラスは他のクラスを拡張することができます。

生成されたクラスがパラメータなしのコンストラクタを持つ必要がある場合は、すべてのプロパティのデフォルト値を指定する必要があります。

data class Movie(var name: String = "", var studio: String = "", var rating: Float = 0F)

5結論

Kotlinのデータクラス、その使用法と要件、作成された定型コードの削減量、およびJavaの同じコードとの比較を見てきました。

Kotlinについてもっと知りたい場合は、 KotlinとJavaの相互運用性 、および既に言及されている Kotlin言語の紹介 などの記事を確認してください。

これらの例の完全な実装は私たちのhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubプロジェクト]にあります。