[英]How to call Kotlin copy() from data class to java class?
假設我有一個數據類,並且想使用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中我們不能。
一種方法是在數據類中創建copy方法,並使用sampleClassObject.copy(...)
在java類中調用它。
但是問題是假設5 parameters in constructor
中總共有5 parameters in constructor
而我只想在java類中pass 2 parameters using copy()
怎么做?
這是因為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)
繼續編碼。 保持學習 :) }
不確定如何在實際用例中使用它,但這可能會有所幫助。
這是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中則禁止使用。
copy()
在Kotlin中如此有用的原因是命名參數,它使您可以有選擇地僅指定所需的參數。
在Java中,此功能不存在,因此人們嘗試使用不同的范例: builders來實現相同的功能。
通過在Kotlin類中定義一個構建器(不幸的是,我們不能使用set
屬性,因為它們不能返回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()
請注意,諸如Lombok之類的項目可以自動生成大量所需的樣板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.