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