Kotlin Constructors and Initializers (With Examples)

Trong bài viết này, bạn sẽ tìm hiểu về các hàm tạo trong Kotlin (cả các hàm tạo chính và phụ) cũng như các khối khởi tạo với sự trợ giúp của các ví dụ.

Hàm tạo là một cách ngắn gọn để khởi tạo các thuộc tính của lớp.

Nó là một hàm thành viên đặc biệt được gọi khi một đối tượng được khởi tạo (tạo). Tuy nhiên, cách chúng hoạt động trong Kotlin hơi khác một chút.

Trong Kotlin, có hai hàm tạo:

  • Hàm tạo chính - cách ngắn gọn để khởi tạo một lớp
  • Hàm tạo thứ cấp - cho phép bạn đặt thêm logic khởi tạo

Khối tạo chính

Hàm tạo chính là một phần của tiêu đề lớp. Đây là một ví dụ:

 class Person (val firstName: String, var age: Int) (// class body)

Các khối mã được bao quanh bởi dấu ngoặc đơn là các nhà xây dựng chính: (val firstName: String, var age: Int).

Hàm khởi tạo đã khai báo hai thuộc tính: firstName( thuộc tính chỉ đọc khi được khai báo bằng từ khóa val) và age(thuộc tính đọc-ghi khi được khai báo với từ khóa var).

Ví dụ: Khối tạo chính

 fun main(args: Array) ( val person1 = Person("Joe", 25) println("First Name = $(person1.firstName)") println("Age = $(person1.age)") ) class Person(val firstName: String, var age: Int) ( )

Khi bạn chạy chương trình, đầu ra sẽ là:

 Tên = Joe Tuổi = 25

Khi đối tượng của Personlớp được tạo "Joe"25các giá trị được truyền như thể Personlà một hàm.

Điều này khởi tạo firstNameagethuộc tính của đối tượng person1 tới "Joe"25tương ứng.

Có nhiều cách khác để sử dụng các hàm tạo chính.

Khối khởi tạo và khối khởi tạo chính

Hàm tạo chính có cú pháp bị ràng buộc và không được chứa bất kỳ mã nào.

Để đặt mã khởi tạo (không chỉ mã để khởi tạo thuộc tính), khối khởi tạo được sử dụng. Nó được bắt đầu bằng inittừ khóa. Hãy sửa đổi ví dụ trên với khối khởi tạo:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName: String var age: Int // initializer block init ( firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") ) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 First Name = Joe Age = 25

Ở đây, các tham số fName và personAge bên trong dấu ngoặc đơn chấp nhận các giá trị "Joe"25tương ứng khi đối tượng person1 được tạo. Tuy nhiên, fName và personAge được sử dụng mà không sử dụng varhoặc valvà không phải là thuộc tính của Personlớp.

Các Personlớp có hai thuộc tính firstName, và tuổi được khai báo.

Khi person1đối tượng được tạo, mã bên trong khối khởi tạo được thực thi. Khối khởi tạo không chỉ khởi tạo các thuộc tính của nó mà còn in chúng.

Đây là một cách khác để thực hiện tác vụ tương tự:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName = fName.capitalize() var age = personAge // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Để phân biệt tham số khởi tạo và thuộc tính, các tên khác nhau được sử dụng (fName và firstName, và personAge và age). Phổ biến hơn là sử dụng _firstName và _age thay vì tên hoàn toàn khác cho các tham số của hàm tạo. Ví dụ:

 class Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // khối khởi tạo init (…)) 

Giá trị mặc định trong hàm tạo chính

Bạn có thể cung cấp giá trị mặc định cho các tham số hàm tạo (tương tự như cung cấp các đối số mặc định cho các hàm). Ví dụ:

 fun main(args: Array) ( println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() ) class Person(_firstName: String = "UNKNOWN", _age: Int = 0) ( val firstName = _firstName.capitalize() var age = _age // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 First Name = Joe Age = 25 person2 được khởi tạo First Name = Jack Age = 0 person3 được khởi tạo First Name = UNKNOWN Age = 0

Kotlin hàm tạo phụ

Trong Kotlin, một lớp cũng có thể chứa một hoặc nhiều hàm tạo thứ cấp. Chúng được tạo bằng constructortừ khóa.

Các hàm tạo thứ cấp không phổ biến trong Kotlin. Cách sử dụng phổ biến nhất của hàm tạo phụ xuất hiện khi bạn cần mở rộng một lớp cung cấp nhiều hàm tạo khởi tạo lớp theo những cách khác nhau. Hãy chắc chắn kiểm tra Kế thừa Kotlin trước khi bạn học nó.

Đây là cách bạn có thể tạo một hàm tạo phụ trong Kotlin:

 class Log (constructor (data: String) (// some code) constructor (data: String, numberOfData: Int) (// some code))

Ở đây, Loglớp có hai hàm tạo thứ cấp, nhưng không có hàm tạo chính.

Bạn có thể mở rộng lớp học dưới dạng:

 class Log (constructor (data: String) (// code) constructor (data: String, numberOfData: Int) (// code)) class AuthLog: Log (constructor (data: String): super (data) (// code ) hàm tạo (dữ liệu: String, numberOfData: Int): super (data, numberOfData) (// code))

Ở đây, các hàm tạo của lớp dẫn xuất AuthLoggọi hàm tạo tương ứng của lớp cơ sở Log. Đối với điều đó, super()được sử dụng.

Trong Kotlin, bạn cũng có thể gọi một hàm tạo từ một hàm tạo khác cùng lớp (như trong Java) bằng cách sử dụng this().

 class AuthLog: Log (constructor (data: String): this (data, 10) (// code) constructor (data: String, numberOfData: Int): super (data, numberOfData) (// code)) 

Ví dụ: Kotlin Secondary Constructor

 fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> " + _data, 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )

Khi bạn chạy chương trình, đầu ra sẽ là:

 Từ AuthLog -> Mật khẩu xấu: 10 lần

Lưu ý: Hàm tạo thứ cấp phải khởi tạo lớp cơ sở hoặc ủy quyền cho một hàm tạo khác (như trong ví dụ trên) nếu lớp không có hàm tạo chính.

thú vị bài viết...