2016-06-17 3 views
45

Ich habe 10+ Parameter in einer Datenklasse, ich möchte die Datenklasse mit einem leeren Konstruktor initialisieren und die Werte nur für einige Parameter mit Setter und übergeben Sie das Objekt an der Server.So erstellen Sie einen leeren Konstruktor für die Datenklasse in Kotlin Android

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<*, *>, 
) 

Verbrauch:

So etwas wird

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

einfach sein, aber es erfordert, dass alle Argumente während der Konstruktor Erstellung übergeben werden. Wie kann ich wie oben beschrieben vereinfachen?

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

Antwort

71

Sie haben 2 Möglichkeiten:

  1. Vergeben Sie einen Standardwert für jeden primary constructor Parameter:

    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. Deklarieren a secondary constructor, die keine Parameter hat:

    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>() 
             ) 
    } 
    

Wenn Sie nicht auf copy oder equals der Activity Klasse verlasse oder benutzen Sie nicht die automatisch generierte data class Methoden an allen normalen Klassen wie so verwenden könnte: zu

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>() 
} 

Nicht jeder DTO Bedürfnisse sei ein data class und umgekehrt. Nach meiner Erfahrung finde ich Datenklassen besonders nützlich in Bereichen, die eine komplexe Geschäftslogik beinhalten.

+1

Dank @miensol, Gibt es eine Möglichkeit diese Kopie Spaß mit getan werden kann. z.B. https://kotlinlang.org/docs/reference/data-classes.html#copying –

+0

@SaiKiran, um 'copy' zu verwenden, benötigen Sie eine Datenklasseninstanz. Um es zu erstellen, müssen Sie einen Konstruktor aufrufen - und hier war das Problem. – miensol

+0

Ich verwende Kotlin 1.1.2 für Android Studio 2.3 und emptyList ist nicht verfügbar:/ – Gonzalo

3

Zusammen mit @miensol Antwort, lassen Sie mich einige Details hinzufügen:

Wenn Sie einen Java-sichtbaren leeren Konstruktor Datenklassen wollen, müssen Sie es explizit definieren.

mit Standardwerten + Konstruktor Spezifizierer ist ganz einfach:

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>() 
) { 
    constructor() : this(title = "") // this constructor is an explicit 
            // "empty" constructor, as seen by Java. 
} 

Dies bedeutet, dass mit diesem Trick können Sie jetzt serialisiert/deserialisiert diese Aufgabe mit den Standard-Java-Serializer (Jackson, Gson usw.).

4

Wenn Sie Standardwerte für alle Felder geben - leere Konstruktor wird automatisch von Kotlin generiert.

data class User(var id: Long = -1, 
       var uniqueIdentifier: String? = null) 

und Sie können einfach anrufen:

val user = User() 
Verwandte Themen