Tìm hiểu về visibility modifier trong kotlin

I, Mở đầu

  • Trong Kotlin, class, object class, interface, constructor, function, property và custom setter của property đều có visibility modifier (custom getter luôn có visiblity modifier giống với property).
  • Kotlin cung cấp 4 visibility modifier: private, protected, internalpublic (mặc định).
  • Chúng sẽ được áp dụng vào các scope khác nhau trong project.

II, Package

  • Function, property, class, object class, interface đều có thể là top-level member.
  • Ví dụ 1:
1
2
3
4
5
6
7
// file name: example.kt
package foo

const val topLevelProperty = 1
fun makeTopLevelFunction() { ... }
class TopLevelClass { ... }
object TopLevelObject { ... }
  • Trong 1 package, các visibility modifier có nhiệm vụ:
    • private: các member chỉ visible ở trong file khai báo chúng.
    • protected: không được sử dụng cho việc khai báo top-level member.
    • internal: các member chỉ visible trong với các member khác trong cùng module.
    • public: các member sẽ visible ở tất cả mọi nơi.

II, Class và interface

  • Đối với các visibility modifỉer member được khai báo trong 1 class:
    • private: các member chỉ visible ở trong class và các member khác (có thể là function, inner class).
    • protected: private + visible trong subclass của nó.
    • internal: các member chỉ visible trong với các member khác trong cùng module.
    • public: các member sẽ visible ở tất cả mọi nơi.
  • Nếu bạn override protected member ở subclass và không xác định visibility modifier, member bị override sẽ có visibility modifier là protected (không phải là public).
  • Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
open class Outer {
private val a = 1
protected open val b = 2
protected open val b1 = 3
internal val c = 3
val d = 4 // public by default

protected class Nested {
public val e: Int = 5
}
}

class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible

override val b = 5 // 'b' is protected

public override val b1 = 6 // must specify explicitly with the protected member of the parent.
}

class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}

III, Constructor

  • Kotlin không cho phép constructor sử dụng protect.
  • Để xác định visiblity modifier cho constructor, chúng ta thêm nó vào trước constructor keyword.
  • Ví dụ 3:
1
2
3
4
5
6
7
class A private constructor(a: Int) { ... }

class B protected constructor() { ... } // Compilation errors

class C internal constructor(){ ...}

class D (){ ... } // same with `public constructor()`

IV, Local variable

  • Local variable là những variable được khai báo bên trong 1 function. Nó chỉ visible bên trong function và các member của function đó.
  • Kotlin không cho phép local variable có visiblity modifier vì nó không có ý nghĩa gì cả.