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

вопрос создан в Wed, May 8, 2019 12:00 AM

Я новичок в 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 массив растровых изображений с нуля?

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

    
0
  1. Да, Java инициализирует эти массивы нулем.
    2019-05-08 21: 54: 07Z
5 ответов                              5                         

В Kotlin вы можете объявить массив с помощью lateinit :

private lateinit var leftToRights: Array<Bitmap?>

Обратите внимание, что вы должны использовать Bitmap? вместо Bitmap, если вы хотите заполнить массив пустыми значениями при его инициализации, а также вы должны использовать var вместо val, потому что свойства lateinit разрешены только для муфты на
- только для
. Позже инициализируйте массив, используя нужный размер с arrayOfNulls() : р>

leftToRights = arrayOfNulls(3)
    

1
2019-05-08 17: 04: 27Z

В kotlin, если вы хотите инициализировать массив значениями NULL, вы должны заставить его принимать NULL в качестве значения.

Для этого вы должны сделать что-то вроде:

private val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)

Указав, что это массив Bitmap?, а не Bitmap, он позволяет создать массив нулей, поскольку каждый элемент является необязательным растровым изображением.

    
1
2019-05-08 16: 36: 18Z

Отвечая на второй вопрос, да, поля объектов с не примитивными типами в 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. Я бы с радостью сделал это комментарием, а не ответом, но мне не хватает репутации: (

    
0
2019-05-08 19: 06: 15Z

По вашей схеме значения в массивах 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

    
0
2019-05-08 19: 25: 51Z

Есть несколько способов инициализации массивов в Kotlin с нулевым значением:

val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)
val leftToRights = Array<Bitmap?>(3){_ -> null }
val leftToRights = arrayOfNulls<Bitmap?>(3)
    
0
2019-05-09 09: 22: 13Z
источник размещен Вот