0Pricing
Kotlin Academy · บทเรียน

Getter และ Setter แบบกำหนดเองด้วย field

เขียนพร็อพเพอร์ตีคำนวณค่าและ setter แบบกำหนดเองโดยใช้คีย์เวิร์ด field สำหรับฟิลด์เบื้องหลัง

Getter และ Setter แบบกำหนดเองด้วย field เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณสมบัติไม่ใช่แค่ฟิลด์

คุณสมบัติแต่ละรายการใน Kotlin มีตัวอ่านค่าที่สร้างขึ้นโดยอัตโนมัติ และสำหรับ var จะมีตัวกำหนดค่าด้วย คุณสามารถเขียนทับตัวเหล่านี้เพื่อเพิ่มตรรกะ เช่น การตรวจสอบ การบันทึกเหตุการณ์ หรือการคำนวณ

ตัวอ่านค่าแบบกำหนดเอง

เขียนทับ get() เพื่อคำนวณค่าทุกครั้งที่มีการอ่านคุณสมบัติ

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

คุณสมบัติที่คำนวณได้

คุณสมบัติที่คำนวณได้ไม่มีฟิลด์สำรอง โดยค่าจะถูกคำนวณใหม่ทุกครั้งที่เข้าถึง

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

ตัวกำหนดค่าแบบกำหนดเองพร้อม field

ภายในตัวกำหนดค่าแบบกำหนดเอง field หมายถึงฟิลด์สำรอง ซึ่งเป็นพื้นที่จัดเก็บข้อมูลจริง

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

การสร้างฟิลด์สำรองโดยอัตโนมัติ

หากตัวอ่านค่าหรือตัวกำหนดค่าใช้ field Kotlin จะสร้างฟิลด์สำรองให้ หากไม่มีตัวใดใช้ ก็จะไม่สร้างฟิลด์ขึ้นมา และคุณสมบัตินั้นจะเป็นคุณสมบัติที่คำนวณล้วน ๆ

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

ตัวกำหนดค่าพร้อมผลข้างเคียง

ใช้ตัวกำหนดค่าแบบกำหนดเองสำหรับการบันทึกเหตุการณ์ การแจ้งเตือนการเปลี่ยนแปลง หรือการทำให้สถานะที่เกี่ยวข้องตรงกัน

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

ตัวกำหนดค่าแบบส่วนตัว

กำหนดตัวกำหนดค่าเป็น private เพื่อเปิดเผยส่วนติดต่อแบบอ่านได้อย่างเดียว ขณะเดียวกันก็ยังอนุญาตให้แก้ไขข้อมูลภายในได้

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

การตรวจสอบในตัวกำหนดค่า

ตัวกำหนดค่าแบบกำหนดเองเป็นตำแหน่งที่เหมาะสมสำหรับการตรวจสอบข้อมูลนำเข้า

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

ตัวอ่านค่าพร้อมตรรกะ

ตัวอ่านค่าสามารถแปลงสถานะที่จัดเก็บไว้ได้ เช่น จัดรูปแบบค่าที่จัดเก็บไว้หรือใช้ค่าทดแทนเริ่มต้น

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

การเปรียบเทียบ val และ var

คุณสมบัติ val มีเฉพาะตัวอ่านค่า ไม่มีตัวกำหนดค่า ส่วนคุณสมบัติ var มีทั้งสองอย่าง

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

ข้อผิดพลาดที่พบบ่อย: การเรียกซ้ำ

อย่าใช้ชื่อพร็อพเพอร์ตีภายในตัวเข้าถึงของพร็อพเพอร์ตีนั้นเอง เพราะจะทำให้เกิดการเรียกซ้ำไม่สิ้นสุด ให้ใช้ field แทน

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

ตรวจสอบอย่างรวดเร็ว

ภายในตัวกำหนดค่าแบบกำหนดเอง ตัวระบุ field อ้างถึงอะไร

สรุปทบทวน

เขียนทับ get() และ set() เพื่อเพิ่มตรรกะให้กับการเข้าถึงพร็อพเพอร์ตี ใช้ field ภายในตัวเข้าถึงเพื่ออ่านหรือเขียนฟิลด์สำรอง กำหนดตัวกำหนดค่าเป็น private สำหรับ API สาธารณะแบบอ่านอย่างเดียว และใช้พร็อพเพอร์ตีคำนวณค่าเมื่อค่านั้นได้มาจากการคำนวณเสมอโดยไม่ต้องมีฟิลด์สำรอง

คำถามที่พบบ่อย

บทเรียน “Getter และ Setter แบบกำหนดเองด้วย field” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Getter และ Setter แบบกำหนดเองด้วย field” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Getter และ Setter แบบกำหนดเองด้วย field”

เขียนพร็อพเพอร์ตีคำนวณค่าและ setter แบบกำหนดเองโดยใช้คีย์เวิร์ด field สำหรับฟิลด์เบื้องหลัง คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “Getter และ Setter แบบกำหนดเองด้วย field” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คอนสตรักเตอร์หลักและพารามิเตอร์พร็อพเพอร์ตี
  2. บล็อก init และลำดับการเริ่มต้น
  3. Getter และ Setter แบบกำหนดเองด้วย field
  4. lateinit และการเริ่มต้นแบบ Lazy
← กลับไปที่ Kotlin Academy