データオブジェクトとは、Kotlinの新しい宣言タイプ(バージョン1.9以降)で、シングルトンオブジェクトとデータクラスの特性を結びつけたものです。これは、一つのオブジェクトのインスタンスのみを持ち、equals、hashCode、toStringメソッドが自動生成される場合に使用されます(データクラスのように)。
以前は、ユニークなエンティティを保持するために、toString()やequals()メソッドを手動で実装したオブジェクトを書く必要があり、または妥協として単一のオブジェクト(インスタンスではなく)を持つデータクラスを使用していました。
シングルトンオブジェクト(object)は自動生成されるequals、hashCode、toStringを持たず、データクラスは複数のインスタンスを前提としています。これは、列挙型のようなモデルに適していません。
データオブジェクトが登場したことで、両方の問題がスマートに解決されました:
コード例:
data object LoadingState data object NoData println(LoadingState == LoadingState) // true println(LoadingState.toString()) // LoadingState
主な特徴:
データオブジェクトと通常のオブジェクトの違いは何ですか?
データオブジェクトのみがコンパイラレベルでequals、hashCode、toStringメソッドの自動生成を受けます;通常のオブジェクトはAnyからの実装を使用します(参照の等価性、貧弱なtoString)。
パラメータを持つコンストラクタ付きのデータオブジェクトは作成できますか?
いいえ、データオブジェクトにはパラメータを持つコンストラクタを持つことはできません。常にパラメータなしで、インスタンスは一つしか存在しません。
データオブジェクトは継承できますか?
はい、データオブジェクトはインターフェース、シールドインターフェースを実装でき、状態階層の一部になることができます。
例:
sealed interface Result data object Success : Result data object Failure : Result
開発者は「データなし」をオブジェクトNoDataとしてモデル化し、次に別のオブジェクトとのequals()で比較して予期しない結果を得ます(参照による比較、内容による比較ではありません)。
利点:
欠点:
データオブジェクトを使用してロード状況を管理し、等価性と出力が期待されるデータクラスのルールに従います。モデル層は状態に基づいたパターンマッチングを安全に利用します。
利点:
欠点: