Lập trình Kotlin — Thay đổi hiện hữu (Visibility modifiers)

Liem Vo
Viet Android Developers
4 min readAug 20, 2020

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.

Photo by Martin Klausen on Unsplash

Ở đây có bốn mức độ hiện hữu trong ngôn ngữ Kotlin:private, protected, internalpublic. 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, objectsinterfaces 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 ở file Test.kt không thể truy xuất bất kì đối tượng nào ở trong file VisibilityModifier.kt
  • Nếu được đánh dấu với internal thì chỉ có thể truy xuất được trong module hiện tại. Ví dụ ta có module second và các đối tượng trong file VisibilityModifier.kt được khai báo internal 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 con
  • internal 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ất
  • public 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ên public

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.

--

--