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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คอนสตรักเตอร์หลักและพารามิเตอร์พร็อพเพอร์ตี
- บล็อก init และลำดับการเริ่มต้น
- Getter และ Setter แบบกำหนดเองด้วย field
- lateinit และการเริ่มต้นแบบ Lazy