Я новичок в kotlin и пытаюсь понять, как правильно инициализировать этот массив.
Мой Java-код:
private Bitmap[] leftToRights;
private Bitmap[] rightToLefts;
private Bitmap[] topToBottoms;
private Bitmap[] bottomToTops;
//On constructor(colCount = 3)
this.topToBottoms = new Bitmap[colCount]; // 3
this.rightToLefts = new Bitmap[colCount]; // 3
this.leftToRights = new Bitmap[colCount]; // 3
this.bottomToTops = new Bitmap[colCount]; // 3
В Котлине (моя попытка):
//Declaration
private val leftToRights: Array<Bitmap>
private val rightToLefts: Array<Bitmap>
private val topToBottoms: Array<Bitmap>
private val bottomToTops: Array<Bitmap>
//Init
Array<Bitmap>(colCount,/*Missing argument, what shall I initialize with?*/)
this.topToBottoms = Array<Bitmap>(colCount,/*Missing argument, what shall I initialize with?*)
this.rightToLefts = Array<Bitmap>(colCount,/*Missing argument, what shall I initialize with?*)
this.leftToRights = Array<Bitmap>(colCount,/*Missing argument, what shall I initialize with?*)
this.bottomToTops = Array<Bitmap>(colCount,/*Missing argument, what shall I initialize with?*)
Итак, каков хороший способ инициализировать эти массивы так же, как это делает java? Может кто-нибудь объяснить, как это работает в java, инициализирует ли java массив Bitmap нулевым значением?
Извините за мой английский, надеюсь, вы понимаете. Я открыт для любых вопросов об этом посте.
В kotlin, если вы хотите инициализировать массив нулями, вы должны заставить его принимать значение null в качестве значения.
Для этого вы должны сделать что-то вроде:
private val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)
Указав, что это массив Bitmap?, а не Bitmap, вы можете создать массив нулей, поскольку каждый элемент является необязательным растровым изображением.
В Котлин вы можете объявить массив с помощью lateinit:
private lateinit var leftToRights: Array<Bitmap?>
Обратите внимание, что вы должны использовать Bitmap? вместо Bitmap, если вы хотите заполнить массив нулями при его инициализации, а также вы должны использовать var вместо val, потому что lateinit разрешено только для изменяемых свойств.
Позже инициализируйте массив, используя нужный размер с помощью arrayOfNulls():
leftToRights = arrayOfNulls(3)
Отвечая на ваш второй вопрос, да, поля объектов с непримитивными типами в Java будут инициализированы нулями.
В дополнение к предыдущему ответу, если вы не хотите использовать var lateinit и предпочитаете читаемость кода повышению производительности от массивов фиксированного размера, вы можете использовать что-то вроде этого:
private val leftToRights = mutableListOf<Bitmap>()
private val rightToLefts = mutableListOf<Bitmap>()
private val topToBottoms = mutableListOf<Bitmap>()
private val bottomToTops = mutableListOf<Bitmap>()
P.S. Я бы с удовольствием сделал это комментарием вместо ответа, но у меня недостаточно репутации :(
По вашему замыслу значения в массивах Bitmap могут быть нулевыми. В Kotlin это отражается массивами, имеющими типArray<Bitmap?>. Имея это в виду, следующий класс Rows будет работать:
class Bitmap
class Rows(val colCount: Int) {
val leftToRights by lazy { init() }
val rightToLefts by lazy { init() }
val topToBottoms by lazy { init() }
val bottomToTops by lazy { init() }
private fun init() = Array<Bitmap?>(colCount) { null }
}
fun main() {
val rows = Rows(3)
with(rows) {
leftToRights[1] = Bitmap()
println(leftToRights[0]) // null
println(leftToRights[1]) // Bitmap@...
println(leftToRights[2]) // null
}
}
Таким образом, вам не нужно lateinit (ленивый сделает это за вас), и вам не нужно использовать var. Здесь https://kotlinlang.org/docs/reference/delegated-properties.html — объяснение того, как работает by lazy.
Есть несколько способов инициализировать массивы в Kotlin нулевым значением:
val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)
val leftToRights = Array<Bitmap?>(3){_ -> null }
val leftToRights = arrayOfNulls<Bitmap?>(3)
Да, Java инициализирует эти массивы нулевым значением.