Как вызвать Kotlin copy () из класса данных в класс Java? - PullRequest
0 голосов
/ 21 декабря 2018

Предположим, у меня есть класс данных, и я хочу использовать copy () и вызывать его в классе java.

В kotlin мы делаем это следующим образом

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 в классе данных и вызвать его в java-классе, используя sampleClassObject.copy(...).

Но проблема в том, что общее количество 5 parameters in constructor и я только хочу pass 2 parameters using copy() в классе Java, как это сделать?

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Причиной, по которой 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 может автоматически генерировать много необходимого шаблона.

0 голосов
/ 21 декабря 2018

Это потому, что Kotlin поддерживает параметры по умолчанию Java не поддерживает.Но вы можете сделать следующее.

На Java

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

На Kotlin

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

Сохранитькодирование.Продолжай учиться :)}

0 голосов
/ 21 декабря 2018

Не уверен, как это можно использовать в реальном случае, но это может быть полезно.

Это 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 ()

Извлечение класса данных из типа, который уже имеет функцию copy (...) с совпадающей сигнатурой, не рекомендуется вKotlin 1.2 и будет запрещен в Kotlin 1.3.

Определение класса данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...