Lập trình Kotlin — Thay đổi hiện hữu (Visibility modifiers)
Trong bài học trước chúng ta đã tìm hiểu về một kỹ thuật mới của Kotlin 1.4 (SAM). Trong bài học hôm nay chúng ta sẽ học về cách thay đổi sự hiện hữu của lớp, đối tượng, hàm, hàm khởi tạo, thuộc tính và giá trị gán.
Ở đây có bốn mức độ hiện hữu trong ngôn ngữ Kotlin:private
, protected
, internal
và public
. Mỗi cấp độ có sẽ làm cho đối tượng dùng nó có một cấp độ hiện hữu khác nhau. Giá trị mặc định hiện hữu là public nếu chúng ta không khai báo sự hiện hữu.
Trong bài học này chúng ta sẽ tập trung học về sự hiện hữu của:
- Gói (Packages)
- Lớp và Giao diện (classes and Interfaces)
- Hàm khởi tạo
- Biến cục bộ trong hàm (Local declarations)
- Modules
Packages
Hàm, thuộc tính và lớp, objects
và interfaces
có thể được khai báo ở mức cao nhất trực tiếp trong một package.
package com.vad.kotlin2020
const val year = 2020
fun printYourName() {}
class Student() {}
object Person {}
Ví dụ ở đây ta có packagecom.vad.kotlin2020
và tên file là VisibilityModifier.kt
. Có thuộc tính year
, hàm printYourName
, lớp Student
và object Person
đang ở mức cao nhất của file.
Lưu lý:
- Nếu chúng ta không cụ thể độ hiện hữu của chúng thì mặc đình là
public
- Nếu đánh dấu chúng là
private
thì chúng chỉ có khả năng truy xuất trong nội bộ file này. Ví dụ ta có hàm main ở fileTest.kt
không thể truy xuất bất kì đối tượng nào ở trong fileVisibilityModifier.kt
- Nếu được đánh dấu với
internal
thì chỉ có thể truy xuất được trongmodule
hiện tại. Ví dụ ta có module second và các đối tượng trong file VisibilityModifier.kt được khai báointernal
thì ở module second ko thể truy xuất được protected
thì không thể dùng với mức khai báo cao nhất.
Lớp và giao diện (Classes và Interfaces)
Đối với thành viên trong lớp thì
private
có nghĩa là chỉ hiện hữu bên trong lớp hay còn gọi là chỉ truy xuất bên trong lớp.protected
giống như private và có thể truy xuất ở lớp coninternal
bất kì đối tượng nào bên trong cùng module và thấy lớp này có thể truy xuấtpublic
bất kì đối tượng nào có thể thấy lớp này thì sẽ thấy các thành viênpublic
Lưu ý là lớp bên ngoài sẽ không thấy thành viên private của lớp bên trong.
Nếu lớp con override
một thành viên protected
và không cụ thể sự hiện hữu thì nó sẽ là protected
giống như ở lớp cha
open class Student() {
val name = "Student"
internal val length = name.length
open protected val lastName = "Last"
private fun printName() {
println(name)
}
}
class A: Student() {
override val lastName: String
get() = super.lastName
}// main is in the same module
fun main() {
val a = A()
println(a.name)
println(a.length)
println(a.lastName) // error because lastName is protected
a.printName() // error because printName is private
}// main is in the different module
fun main() {
val a = A()
println(a.name)
println(a.length) // error because lenght is internal
println(a.lastName) // error because lastName is protected
a.printName() // error because printName is private
}
Các hàm khởi tạo (Constructors)
Các hàm khởi tạo mặc định là public và muốn giới hạn cú pháp của nó với cú pháp như sau
class Student internal constructor()
Ở đây internal
là từ khóa chỉ rằng lớp được dùng chỉ hiện hữu trong module đó. Từ khóa private
thì chỉ rằng hàm khởi tạo chỉ có thể truy xuất trong lớp đó.
Biến cục bộ
Biến được khai báo trong hàm và lớp hoặc các hàm khác không thể dùng.
Modules
Từ khoá internal
nghĩa là chỉ hiện hữu bên trong module. Cụ thể là, module là tập hợp những file code được biên dịch cùng nhau.
- Một IntelliJ IDEA module
- Một maven project
- Tập hợp nguồn của Gradle
- Một tập hợp file của ant task
Cảm ơn các bạn đã đọc bài. Đăng ký kênh chúng tôi để xem những bài học mới nhất.
Youtube kênh: https://bit.ly/2EFOOXs
Thảo luận bằng cách comment ở đây hoặc trong video của blog này.