デストラクチャリング宣言は、オブジェクトを変数に展開することを許可し、コードを簡潔に保ちます。歴史的に、Javaやその他の言語では、各コンポーネントのための個別のgetterを書かなければならず、構文が煩雑になりました。Kotlinは、分解(デストラクチャリング)をサポートするために、特別なcomponentN()メソッドを導入しました。
問題: 複合オブジェクトの部分を手動で取得するのは不便で、多くの代入が必要になり、コードの可読性が失われます。
解決策: data classはコンパイル時に自動的にcomponentN()メソッドを取得し、プロパティの値を取得するためのデストラクチャリング宣言を使用できるようになります。
コード例:
data class User(val name: String, val age: Int) val user = User("Pavel", 32) val (name, age) = user println("$name is $age years old") // Pavel is 32 years old
主な特徴:
デストラクチャリング宣言で取得できる変数の数は?
クラスに定義されたcomponentN()メソッドの数だけ取得できます。data classでは、プライマリコンストラクタのすべてのプロパティに対して自動的に作成されます(最大255まで)。
デストラクチャリングは通常の(非data)クラスでも動作しますか?
クラスにcomponentN()メソッドが手動で宣言されている場合のみ動作します。
例:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (x, y) = Point(10, 20)
デストラクチャリング宣言で値をスキップできますか?
はい、_(アンダースコア)を使用して外部変数をスキップできます。
val (_, onlyAge) = user
ネガティブケース
プロジェクトで開発者がcomponentN()メソッドのない通常のクラスに対してデストラクチャリングを使用しようとし、コンパイルエラーが発生し、その後非常に大きなクラス(10以上のプロパティ)のために手動で追加しました。
利点:
欠点:
ポジティブケース
限られた数のパラメータを持つdata class(例えば、Result(val data: T, val error: Throwable?))を使用し、APIのレスポンスを処理する際に簡潔なデストラクチャリング宣言を使用します。
利点:
欠点: