Trong bài viết này, bạn sẽ tìm hiểu về tất cả 4 bộ điều chỉnh hiển thị/truy cập trong Kotlin và cách chúng hoạt động trong các tình huống khác nhau.

Bộ điều chỉnh hiển thị/ truy cập là các từ khóa thiết lập khả năng hiển thị (khả năng truy cập) của các class, đối tượng, interface, hàm tạo, hàm, thuộc tính và setters của chúng. (Chúng ta không thể thiết lập bộ điều chỉnh hiển thị của getters vì chúng luôn có khả năng hiển thị giống như thuộc tính.)

Trong bài viết về class và đối tượng trong Kotlin , bạn đã tìm hiểu một cách tóm tắt về các bộ điều chỉnh hiển thị/ truy cập với public và private. Trong bài viết này, bạn sẽ tìm hiểu thêm về hai bộ điều chỉnh hiển thị protected và internal (cũng như public và private) chi tiết.

1. Bộ điều chỉnh hiển thị bên trong gói

Một gói tổ chức một tập hợp các hàm, thuộc tính và các class, đối tượng và interface liên quan đến nhau. Hãy đọc về Gói trong Kotlin

Bộ điều chỉnhMô tả
publiccác khai báo có thể nhìn thấy ở khắp mọi nơi
privatehiển thị bên trong tệp chứa khai báo
internalhiển thị bên trong cùng một mô-đun (một tập hợp các tệp trong Kotlin được biên dịch cùng nhau)
protectedkhông có sẵn cho các gói (được sử dụng cho các subclass)

Lưu ý: Nếu bộ điều chỉnh hiển thị không được chỉ định, thì theo mặc định sẽ là public.

Hãy lấy một ví dụ:

// file name: hello.kt

package test

fun function1() {}   // public by default and visible everywhere

private fun function2() {}   // visible inside hello.kt

internal fun function3() {}   // visible inside the same module

var name = "Foo"   // visible everywhere
    get() = field   // visible inside hello.kt (same as its property)
    private set(value) {   // visible inside hello.kt
        field = value
    }

private class class1 {}   // visible inside hello.kt

2. Bộ điều chỉnh hiển thị bên trong các class và interface

Dưới đây là cách các bộ điều chỉnh hiển thị hoạt động cho các thành viên (hàm, thuộc tính) được khai báo bên trong một class:

Bộ điều chỉnhMô tả
publichiển thị cho bất kỳ khách hàng nào có thể thấy class khai báo
privatechỉ hiển thị bên trong class
protectedhiển thị bên trong class và các subclass của nó
internalhiển thị cho bất kỳ máy khách nào bên trong mô-đun có thể thấy class khai báo

Lưu ý: Nếu bạn ghi đè một thành viên protected trong class dẫn xuất mà không chỉ định mức độ hiển thị của nó, khả năng hiển thị của nó cũng sẽ là protected.

Hãy lấy một ví dụ:

open class Base() {
    var a = 1                 // public by default
    private var b = 2         // private to Base class
    protected open val c = 3  // visible to the Base and the Derived class
    internal val d = 4        // visible inside the same module

    protected fun e() { }     // visible to the Base and the Derived class
}

class Derived: Base() {

    // a, c, d, and e() of the Base class are visible
    // b is not visible

    override val c = 9        // c is protected
}

fun main(args: Array<String>) {
    val base = Base()

    // base.a and base.d are visible
    // base.b, base.c and base.e() are not visible

    val derived = Derived()
    // derived.c is not visible
}

3. Thay đổi mức độ hiển thị của một hàm tạo

Theo mặc định, khả năng hiển thị của một hàm tạo là public. Tuy nhiên, bạn có thể thay đổi nó. Để làm điều đó, bạn cần phải thêm từ khóa constructor rõ ràng.

Khả năng hiển thị mặc định của hàm tạo là public trong ví dụ dưới đây:

class Test(val a: Int) {
    // code
}

Đây là cách bạn có thể thay đổi khả năng hiển thị của nó.

class Test private constructor(val a: Int) {
    // code
}

Ở đây hàm tạo là private.

Lưu ý:  Trong Kotlin, các hàm cục bộ, biến và class không thể có các bộ điều chỉnh hiển thị.

Full series tự học Kotlin từ cơ bản tới nâng cao.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!