Инициализировать свойство класса Array в конструкторе

Я новичок в 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 нулевым значением?

Извините за мой английский, надеюсь, вы понимаете. Я открыт для любых вопросов об этом посте.

Да, Java инициализирует эти массивы нулевым значением.

Louis Wasserman 08.05.2019 23:54
0
1
701
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

В 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)

Другие вопросы по теме