Обновлено: добавлено несколько пояснений из комментариев
Я хотел бы использовать тот же код отображения для основного конструктора и метод copy()
неизменяемого data class
.Как я могу сделать это, не создавая сначала пустой объект, а затем используя copy()
на нем?
Проблема заключается в том, что если я добавлю новый атрибут со значением по умолчанию к Employee
иEmployeeForm
было бы легко добавить его только в одну из двух функций отображения и забыть о другой (toEmployeeNotReusable
/ copyEmployee
).
Это классы данных, которые я хотел бы отобразитьмежду:
@Entity
data class Employee(
val firstName: String,
val lastName: String,
val jobType: Int,
@OneToMany(mappedBy = "employee", cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
private val _absences: MutableSet<Absence> = mutableSetOf(),
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0 // prevents @Joffrey's answer from working
) {
init {
_absences.forEach { it.employee = this }
}
val absences get() = _absences.toSet()
fun addAbsence(newAbsence: Absence) {
newAbsence.employee = this
_absences += newAbsence
}
@Entity
@Table(name = "absence")
data class Absence(
// ... omitted fields
) {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "employee_id")
lateinit var employee: Employee
}
}
data class EmployeeForm(
var firstName: String = "",
var lastName: String = "",
var jobType: Int = 0
) {
// not reusable
fun toEmployeeNotReusable(): Employee {
return Employee(firstName, lastName, jobType)
}
// works but hacky
fun toEmployee(): Employee {
return copyEmployee(Employee("", "", 0))
}
fun copyEmployee(employee: Employee): Employee {
return employee.copy(
firstName = firstName,
lastName = lastName,
jobType = jobType
)
}
}
Хотя изменчивость была бы хорошей, в моем случае мне было бы интересно узнать, как это возможно.