1. ホーム
  2. アンドロイド

[解決済み】Kotlin Androidでデータクラスに空のコンストラクタを作成する方法

2022-04-04 19:09:41

質問

Kotlin データクラスで 10 個以上の変数が宣言されていますが、Java で通常行うように、空のコンストラクタを作成したいと思います。

データクラスです。

data class Activity(
    var updated_on: String,
    var tags: List<String>,
    var description: String,
    var user_id: List<Int>,
    var status_id: Int,
    var title: String,
    var created_at: String,
    var data: HashMap<*, *>,
    var id: Int,
    var counts: LinkedTreeMap<*, *>,
)

想定される使用方法

val activity =  Activity();
activity.title = "New Computer"
sendToServer(activity)

しかし、データ・クラスでは、コンストラクタを作成する際にすべての引数を渡す必要があります。JavaのPOJOクラスのコンストラクタのように、これを簡略化するにはどうしたらよいでしょうか?

val activity =  Activity(null,null,null,null,null,"New Computer",null,null,null,null)
sendToServer(activity)

解決方法は?

ここで2つの選択肢があります。

  1. にデフォルト値を割り当てる。 一次コンストラクタ パラメータを指定します。

    data class Activity(
        var updated_on: String = "",
        var tags: List<String> = emptyList(),
        var description: String = "",
        var user_id: List<Int> = emptyList(),
        var status_id: Int = -1,
        var title: String = "",
        var created_at: String = "",
        var data: HashMap<*, *> = hashMapOf<Any, Any>(),
        var id: Int = -1,
        var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>()
    ) 
    
    
  2. 宣言する 2次コンストラクタ は、パラメータを持たない。

    data class Activity(
        var updated_on: String,
        var tags: List<String>,
        var description: String,
        var user_id: List<Int>,
        var status_id: Int,
        var title: String,
        var created_at: String,
        var data: HashMap<*, *>,
        var id: Int,
        var counts: LinkedTreeMap<*, *>
    ) {
        constructor() : this("", emptyList(), 
                             "", emptyList(), -1, 
                             "", "", hashMapOf<Any, Any>(), 
                             -1, LinkedTreeMap<Any, Any>()
                             )
    }
    
    

に依存しない場合 copy または equalsActivity クラスを使用しないか、自動生成された data class メソッドを一切使用しない場合は、このように通常のクラスを使用することができます。

class ActivityDto {
    var updated_on: String = "",
    var tags: List<String> = emptyList(),
    var description: String = "",
    var user_id: List<Int> = emptyList(),
    var status_id: Int = -1,
    var title: String = "",
    var created_at: String = "",
    var data: HashMap<*, *> = hashMapOf<Any, Any>(),
    var id: Int = -1,
    var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>()
}

すべての DTO にする必要があります。 data class その逆もしかりです。実際、私の経験では、複雑なビジネスロジックを含む分野ではデータクラスが特に有用だと思います。