如何从数据类到Java类调用Kotlin copy()?

时间:2018-12-21 08:09:08

标签: java android kotlin

假设我有一个数据类,并且想使用copy()并在Java类中调用它。

在科特林,我们确实喜欢这样

data class User(val name: String = "", val age: Int = 0)

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)`

但是在Java中我们不能。

一种方法是在数据类中创建复制方法,然后使用sampleClassObject.copy(...)在java类中调用它。

但是问题是假设总共有5 parameters in constructor,而我只想在Java类中pass 2 parameters using copy()怎么做?

3 个答案:

答案 0 :(得分:2)

这是因为Kotlin支持默认参数,而Java不支持。 但是您可以执行以下操作。

  

在Java中

User user = new User().copy("Your Name", 10);
System.out.println(user.copy().getName());
  

在科特林

data class User(val name: String = "", val age: Int = 0){
fun copy() = User(name, age)
  

保持编码。保持学习 :)       }

答案 1 :(得分:1)

不确定如何在实际用例中使用它,但这可能会有所帮助。

这是User类:

data class User(val param1: String = "",
                val param2: String = "",
                val param3: String = "",
                val param4: String = "",
                val param5: String = "") {
    constructor(param1: String, param2: String) : this(param1, param2,
            "This is optional 1",
            "This is optional 2",
            "This is optional 3")

    fun copy(param1: String, param2: String) = User(param1, param2)
}

这是在java类中使用它的方法:

    User user = new User("a", "b").copy("c", "d");

默认情况下,您不需要这样做,数据类已经具有copy()函数

  

在Kotlin 1.2中不建议从已经具有copy(...)函数且具有匹配签名的类型中派生数据类,而在Kotlin 1.3中则禁止。

Data class defination

答案 2 :(得分:1)

set之所以在Kotlin中如此有用的原因是命名参数,它使您可以有选择地仅指定所需的参数。

在Java中,此功能不存在,因此人们尝试使用不同的范例来实现相同的功能: builders

通过在Kotlin类中定义一个构建器(不幸的是,我们不能使用this属性,因为它们不能返回data class User(val name: String, val age: Int) { class Builder(origin: User) { private var name: String = origin.name private var age: Int = origin.age // also performs operations on 'this' and returns 'this' fun name(value: String) = this.also { name = value } fun age(value: Int) = this.also { age = value } fun build() = User(name, age) } } ):

User user = new User(...);

User copied = new User.Builder(user)
   .name("Alfred")
   .build();

然后您可以执行以下操作:

// Kotlin
data class User(val name: String, val age: Int) {
    ...
    fun copy() = Builder(this)
}

// Java
User copied = user.copy().name("Alfred").build()

如果您需要额外的语法糖,则可以随时添加更多方法:

beforeAll

请注意,诸如Lombok之类的项目可以自动生成大量所需的样板。