2017-06-09 89 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 –