2017-06-09 90 views
0

我使用Android工作室的Kotlin插件將我的Java類轉換爲Kotlin。事情不是Kotlin風格。我想要改用Kotlin Data Class。但是每當我使用主要和次要構造函數創建它時,它都不起作用。在我的情況下,正確的DATA類實現是什麼?如何將Java類轉換爲Kotlin數據類

class Task { 

    @SerializedName("_id") 
    var id: String? = null 
    @SerializedName("text") 
    var taskTitle: String? = null 
    @SerializedName("completed") 
    var isCompleted: Boolean? = null 

    constructor(taskTitle: String) { 
     this.taskTitle = taskTitle 
    } 

    constructor(taskTitle: String, completed: Boolean?) { 
     this.taskTitle = taskTitle 
     this.isCompleted = completed 
    } 

    constructor(id: String, taskTitle: String, isCompleted: Boolean?) { 
     this.id = id 
     this.taskTitle = taskTitle 
     this.isCompleted = isCompleted 
    } 

} 

回答

6

Kotlin在構造函數中引入參數的默認值。你可以使用它們來創建只有一個使用Kotlin的構造函數的數據類。 它看起來像這樣

data class Task( 
    @SerializedName("_id") var id: String? = null, 
    @SerializedName("text") var taskTitle: String? = null, 
    @SerializedName("completed") var isCompleted: Boolean? = null 
) 

所以,你可以利用例如任意數量的參數使用你的數據類:

var task = Task(taskTitle = "title") 
var task = Task("id", "title", false) 
var task = Task(id = "id", isCompleted = true) 

你甚至可以替換參數順序

var task = Task(taskTitle = "title", isCompleted = false, id = "id") 
+1

所以,再有就是不需要具有不同參數數目的二級構造函數? – MikeB

+1

不,您必須傳遞必需的參數(在這種情況下,它們都不是),其餘部分是可選的,並且將被初始化爲默認值。如果你想爲只有兩個參數的自定義值,你可以按名稱指定它們(如我的回答中所述) – Tuby

+3

請注意,如果你想從Java代碼訪問不同的構造函數,你需要添加'@ JvmOverloads'註釋到構造函數。 https://stackoverflow.com/questions/35748906/jvmoverloads-annotation-for-class-primary-constructor –