Инициализировать свойство класса Array в конструкторе - PullRequest
0 голосов
/ 08 мая 2019

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

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

Ответы [ 5 ]

1 голос
/ 08 мая 2019

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

private lateinit var leftToRights: Array<Bitmap?>

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

leftToRights = arrayOfNulls(3)
1 голос
/ 08 мая 2019

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

Чтобы сделать это, вы должны сделать что-то вроде:

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

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

0 голосов
/ 09 мая 2019

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

val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)
val leftToRights = Array<Bitmap?>(3){_ -> null }
val leftToRights = arrayOfNulls<Bitmap?>(3)
0 голосов
/ 08 мая 2019

По вашей схеме значения в массивах Bitmap могут быть нулевыми. В Котлине это отражается массивами типа 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 голосов
/ 08 мая 2019

Отвечая на ваш второй вопрос, да, поля объектов с не примитивными типами в Java будут инициализироваться с нулями.

В дополнение к предыдущему ответу, если вы не хотите использовать var lateinit и выпредпочитая читабельность кода, а не выигрыш в производительности от массивов фиксированного размера, вы можете использовать что-то вроде этого:

private val leftToRights = mutableListOf<Bitmap>()
private val rightToLefts = mutableListOf<Bitmap>()
private val topToBottoms = mutableListOf<Bitmap>()
private val bottomToTops = mutableListOf<Bitmap>()

PS Я бы с радостью сделал этот комментарий вместо ответа, но мне не хватает репутации :(

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...