Kotlin Nested class

1. Giới thiệu

Trong Java ta có thể viết một class bên trong thân của một class khác:

Java

  class Outer {
    private int bar = 1;

    class Nested{
      public int foo(){
        return bar;
      }
    }
  }

Với Kotlin, ta cũng có thể làm tương tự:

Kotlin

  class Outer {
      private val bar: Int = 1
      class Nested {
          fun foo() = 2
      }
  }

  val demo = Outer.Nested().foo() // == 2

Tuy nhiên, khi khai báo như trên, trong Kotlin, class Nested sẽ không thể truy cập đến các phần tử của class Outer chứa nó như trong Java. Để làm được điều đó, ta cần sử dụng từ khóa inner trong Kotlin.

2. Inner class

Một class có thể được khai báo với từ khóa inner có thể truy cập đến các phần tử của class chứa nó. Inner class mang một tham chiếu đến một đối tượng của class chứa nó:

  class Outer {
    private val bar: Int = 1
    private var fooz: String = "hello"
    inner class Inner {
        fun foo() = bar
        fun baz() {
          this@Outer.fooz = "hi"
        }
    }
  }

  val demo = Outer().Inner().foo() // == 1

Để trỏ đến outer class, ta sử dụng từ khóa this với @label như đã nói trong phần Biểu thức this.

3. Anonymous inner class (Lớp con vô danh)

Để khởi tạo anonymous inner class, chúng ta sử dụng [object expression]:

  textView?.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View?) {
      //....
    }
  })

Nếu object được khởi tạo là một functional Java interface (một interface chỉ có duy nhất một method), chúng ta có thể sử dụng lambda và khai báo như sau:

  val listener = View.OnClickListener {

  }