Kotlinのデータクラス
1. 概要
Kotlin言語は、データコンテナとして使用される単純なクラスを表すデータクラスの概念を導入し、追加のロジックをカプセル化しません。 簡単に言えば、Kotlinのソリューションにより、多くの定型コードを記述しないようにすることができます。
この簡単な記事では、Kotlinのデータクラスを見て、対応するJavaクラスと比較します。
2. Kotlinのセットアップ
Kotlinプロジェクトのセットアップを開始するには、introduction to the Kotlin Languageチュートリアルを確認してください。
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データクラス
次に、the same Movie class, with the same functionalities, using Kotlinを作成します。
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 constructorを使用できます。
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 Interoperabilityやすでに説明したIntroduction to the Kotlin Languageなどの記事を確認してください。
これらの例の完全な実装は、GitHub projectにあります。