Я хотел бы инициализировать свойства моего класса. Поскольку я сильно использую функциональные элементы Kotlin, я бы хотел поставить эти инициализации на хорошо названные функции, чтобы повысить читаемость моего кода. Проблема в том, что я не могу назначить свойство val, если код не находится в блоке init, а в функции, которая вызывается из блока init.Невозможно вызвать функцию из блока init из-за свойства val
Можно ли разделить инициализацию класса на разные функции, если свойства являются vals?
Вот код:
val socket: DatagramSocket = DatagramSocket()
val data: ByteArray = "Cassiopeiae server discovery packet".toByteArray()
val broadcastAddresses: List<InetAddress>
init {
socket.broadcast = true
val interfaceAddresses = ArrayList<InterfaceAddress>()
collectValidNetworkInterfaces(interfaceAddresses)
collectBroadcastAddresses(interfaceAddresses)
}
private fun collectValidNetworkInterfaces(interfaceAddresses: ArrayList<InterfaceAddress>) {
NetworkInterface.getNetworkInterfaces().toList()
.filter { validInterface(it) }
.forEach { nInterface -> nInterface.interfaceAddresses.toCollection(interfaceAddresses) }
}
private fun collectBroadcastAddresses(interfaceAddresses: ArrayList<InterfaceAddress>) {
broadcastAddresses = interfaceAddresses
.filter { address -> address.broadcast != null }
.map { it.broadcast }
}
Конечно, это не компиляции, потому что collectBroadcastAddresses функция пытается переназначить broadcastAddresses Валу. Хотя я не хочу помещать код этой функции в блок init, потому что не очевидно, что делает код, и имя функции говорит об этом очень красиво.
Что я могу сделать в таких случаях? Я хочу, чтобы мой код был чистым, это самый важный момент!
Можем ли мы использовать lateinit как: lateinit VAL broadcastAddresses: Список? –
user1453345