假设我有一个数据类,并且想使用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()
怎么做?
答案 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中则禁止。
答案 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之类的项目可以自动生成大量所需的样板。