Из Kotlin documentation, пользовательские сеттеров допускаются:Почему инициализаторы свойств не вызывают пользовательский сеттер?
class Test {
var stringRepresentation: String
get() = field
set(value) {
setDataFromString(value)
}
init {
stringRepresentation = "test"
}
private fun setDataFromString(value: String) { }
}
Но вы не можете иметь пользовательский сеттер без пользовательского геттера (и инициализации от init
блока):
class Test {
// Compilation error: "Property must be initialized"
var stringRepresentation: String
set(value) {
setDataFromString(value)
}
init {
stringRepresentation = "test"
}
private fun setDataFromString(value: String) { }
}
Хотя вы можете иметь пользовательский геттер без настраиваемого сеттера, здесь нет проблем:
class Test {
var stringRepresentation: String
get() = field
init {
stringRepresentation = "test"
}
private fun setDataFromString(value: String) { }
}
Так почему бы вам не использовать ac ustom с свойством, инициализированным из блока init
, и почему блок init
вызывает пользовательский сеттер, в то время как инициализатор свойств назначает напрямую, минуя настраиваемый сеттер?
class Test {
var stringRepresentation: String = "" // Does not call custom setter
set(value) {
setDataFromString(value)
}
init {
stringRepresentation = "test" // Calls custom setter
}
private fun setDataFromString(value: String) { }
}
Просто с пониманием, почему добавление пользовательского сеттера с инициализацией свойства блока init не будет скомпилировано (поскольку свойство * инициализируется *). Есть ли способ избежать дублирования кода в инициализаторе и настраиваемом сетевом устройстве без передачи другому методу? Я хотел бы выполнить некоторую работу во время инициализации и избежать записи в свойство дважды. Такая же работа должна выполняться всякий раз, когда вызывается 'set'. – breandan
Ну, блок init инициализирует свойство. Но поскольку свойство имеет собственный блок initter, для этого используется этот настраиваемый набор. И поскольку пользовательский сеттер требует, чтобы свойство было инициализировано либо значением по умолчанию, либо конструктором, вам необходимо предоставить один из них. – Januson
О дублировании ... частный метод - самый простой способ. Но это зависит от вашего варианта использования. – Januson