5 Câu hỏi: Khởi tạo một thuộc tính lớp Array trong một hàm tạo

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi là người mới trong kotlin và tôi đang cố gắng hiểu làm thế nào tôi có thể khởi tạo mảng này theo cách chính xác.

Mã java của tôi:

 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

Trong Kotlin (thử của tôi):

//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?*)

Vậy đâu là cách tốt để khởi tạo các mảng này giống như java? Ai đó có thể giải thích cách nó hoạt động trong java không, java có khởi tạo mảng Bitmap bằng null không?

Xin lỗi vì tiếng Anh của tôi, hy vọng bạn có thể hiểu nó. Tôi mở cho bất kỳ câu hỏi về bài đăng này.

    
0
  1. Có, Java khởi tạo các mảng đó bằng null.
    2019-05-08 21: 54: 07Z
5 Câu trả lời                              5                         

Trong Kotlin , bạn có thể khai báo mảng bằng lateinit :

private lateinit var leftToRights: Array<Bitmap?>

Lưu ý rằng bạn phải sử dụng Bitmap? thay vì Bitmap nếu bạn muốn điền vào mảng bằng null khi bạn khởi tạo nó và bạn cũng phải sử dụng var thay vì val. Sau đó, khởi tạo mảng bằng kích thước bạn muốn với lateinit :

arrayOfNulls()     
1
2019-05-08 17: 04: 27Z

Trong kotlin nếu bạn muốn khởi tạo một mảng bằng null thì bạn phải làm cho nó chấp nhận null làm giá trị.

Để làm điều này, bạn sẽ làm một cái gì đó như:

leftToRights = arrayOfNulls(3)

Bằng cách chỉ định đó là một mảng

private val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)
chứ không phải Bitmap?, nó cho phép bạn tạo một mảng null vì mỗi mục là một bitmap tùy chọn.     
1
2019-05-08 16: 36: 18Z

Trả lời câu hỏi thứ hai của bạn, vâng, các trường đối tượng với các kiểu không nguyên thủy trong Java sẽ được khởi tạo bằng null.

Ngoài phản hồi trước đó, nếu bạn không muốn sử dụng Bitmap và bạn thích khả năng đọc mã hơn mức tăng hiệu suất từ ​​các mảng có kích thước cố định, bạn có thể sử dụng một cái gì đó như thế này:

var lateinit

P.S. Tôi sẵn sàng đưa ra nhận xét này thay vì phản hồi, nhưng tôi không có đủ danh tiếng: (

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

Theo thiết kế của bạn, các giá trị trong mảng

private val leftToRights = mutableListOf<Bitmap>()
private val rightToLefts = mutableListOf<Bitmap>()
private val topToBottoms = mutableListOf<Bitmap>()
private val bottomToTops = mutableListOf<Bitmap>()
có thể là null. Trong Kotlin, điều này được phản ánh bởi các mảng có kiểuBitmap. Với suy nghĩ này, lớp Array<Bitmap?> sau đây sẽ hoạt động: Rows

Cách này bạn không cần

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
    }
}
(lười làm điều này cho bạn) và bạn không cần sử dụng lateinit. Tại đây https://kotlinlang.org/docs/reference/delegated-properIES.html là một lời giải thích về cách var hoạt động     
0
2019-05-08 19: 25: 51Z

Có nhiều cách để khởi tạo mảng trong Kotlin bằng null:

by lazy     
0
2019-05-09 09: 22: 13Z
val leftToRights: Array<Bitmap?> = arrayOf(null, null, null)
val leftToRights = Array<Bitmap?>(3){_ -> null }
val leftToRights = arrayOfNulls<Bitmap?>(3)
nguồn đặt đây