簡體   English   中英

如何從數據類到Java類調用Kotlin copy()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM