บล็อก init และลำดับการเริ่มต้น
ใช้บล็อก init และทำความเข้าใจลำดับการเริ่มต้นของพร็อพเพอร์ตีและบล็อก
บล็อก init และลำดับการเริ่มต้น เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
บล็อกการเริ่มต้นคืออะไร
บล็อก init { } มีโค้ดที่ทำงานเมื่อสร้างอินสแตนซ์ และเป็นส่วนหนึ่งของตรรกะในตัวสร้างหลัก
บล็อกการเริ่มต้นแบบง่าย
บล็อกการเริ่มต้นจะทำงานระหว่างการสร้างอินสแตนซ์ หลังตัวเริ่มต้นคุณสมบัติ โดยเป็นไปตามลำดับในซอร์สโค้ด
class Logger(val name: String) {
init {
println("Constructed Logger("$name")")
}
}
fun main() {
val l = Logger("auth")
}การตรวจสอบในบล็อกการเริ่มต้น
ใช้ require / check ภายในบล็อกการเริ่มต้น เพื่อบังคับใช้เงื่อนไขคงรูปขณะสร้างอินสแตนซ์
class Percentage(val value: Int) {
init {
require(value in 0..100) { "value must be 0..100, was $value" }
}
}
fun main() {
println(Percentage(75).value)
// Percentage(150) // throws IllegalArgumentException
}บล็อกการเริ่มต้นหลายบล็อก
คุณสามารถมีบล็อกการเริ่มต้นหลายบล็อกได้ โดยบล็อกเหล่านี้จะทำงานตามลำดับในซอร์สโค้ด สลับไปกับตัวเริ่มต้นคุณสมบัติ
class Demo(val x: Int) {
init { println("First init, x=$x") }
val doubled = x * 2
init { println("Second init, doubled=$doubled") }
}
fun main() {
Demo(5)
}ลำดับของตัวเริ่มต้นคุณสมบัติและบล็อกการเริ่มต้น
ตัวเริ่มต้นคุณสมบัติและบล็อกการเริ่มต้นจะทำงานจากบนลงล่างตามลำดับในซอร์สโค้ด คุณต้องกำหนดค่าให้คุณสมบัติก่อนนำไปใช้
class Order {
val createdAt = System.currentTimeMillis()
init { println("created at $createdAt") }
val nextId = 1
init { println("next id = $nextId") }
}
fun main() {
Order()
}ไม่สามารถใช้คุณสมบัติก่อนเริ่มต้นได้
การอ้างอิงคุณสมบัติก่อนที่ตัวเริ่มต้นของคุณสมบัตินั้นจะทำงาน ถือเป็นข้อผิดพลาดขณะคอมไพล์
class Bad {
init {
// println(name) // ERROR: name not yet initialized
}
val name = "after init"
}
fun main() { Bad() }การคำนวณคุณสมบัติที่ได้มา
ใช้บล็อกการเริ่มต้นเพื่อคำนวณสถานะที่ได้มาซึ่งขึ้นอยู่กับพารามิเตอร์ของตัวสร้างหลายรายการ
class Rectangle(val width: Int, val height: Int) {
val area: Int
init {
area = width * height
}
}
fun main() {
val r = Rectangle(4, 5)
println("area = ${r.area}") // 20
}ผลข้างเคียง: การบันทึกเหตุการณ์
ใช้บล็อกการเริ่มต้นสำหรับการตั้งค่าที่ไม่ใช่เรื่องง่าย เช่น การบันทึกเหตุการณ์ การจัดสรรหน่วยความจำ หรือการลงทะเบียน
class Service(val name: String) {
init {
println("[BOOT] starting service '$name'")
}
}
fun main() {
Service("auth")
Service("payments")
}ลำดับการเริ่มต้นกับคลาสย่อย
บล็อกการเริ่มต้นของคลาสแม่จะทำงานก่อนบล็อกการเริ่มต้นของคลาสย่อย คุณสมบัติของแต่ละคลาสจะเริ่มต้นตามลำดับในซอร์สโค้ด
open class Base {
init { println("Base init") }
}
class Sub : Base() {
init { println("Sub init") }
}
fun main() { Sub() }หลีกเลี่ยงตรรกะหนักในบล็อกการเริ่มต้น
บล็อกการเริ่มต้นที่ใช้เวลานานทำให้การสร้างอินสแตนซ์ทุกครั้งช้าลง หากการตั้งค่ามีค่าใช้จ่ายสูง ให้พิจารณาการเริ่มต้นแบบเลื่อนเวลา หรือเมธอดโรงงาน
class Heavy(val n: Int) {
val data: List<Int> by lazy { (1..n).toList() }
}
fun main() {
val h = Heavy(1_000_000)
println("Created without computing data")
println("First element: ${h.data[0]}") // now data initializes
}การรวมบล็อกการเริ่มต้นกับตัวสร้างรอง
ตัวสร้างรองจะส่งต่อไปยังตัวสร้างหลัก และบล็อกการเริ่มต้นจะทำงานเป็นส่วนหนึ่งของเส้นทางการทำงานของตัวสร้างหลัก
class Box(val content: String) {
init { println("init for '$content'") }
constructor(): this("empty") { println("secondary done") }
}
fun main() {
Box()
}ตรวจสอบอย่างรวดเร็ว
บล็อก init หลายบล็อกและตัวเริ่มต้นคุณสมบัติในคลาส Kotlin ทำงานตามลำดับใด
ทบทวน
บล็อก init มีตรรกะที่ทำงานระหว่างการสร้างอินสแตนซ์ เช่น การตรวจสอบ คุณสมบัติที่คำนวณจากข้อมูลอื่น และผลข้างเคียง บล็อกหลายบล็อกจะทำงานตามลำดับในซอร์สโค้ด สลับไปกับตัวเริ่มต้นคุณสมบัติ หลีกเลี่ยงงานหนักในบล็อกการเริ่มต้น และใช้ lazy หรือเมธอดโรงงานแทน
คำถามที่พบบ่อย
บทเรียน “บล็อก init และลำดับการเริ่มต้น” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “บล็อก init และลำดับการเริ่มต้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “บล็อก init และลำดับการเริ่มต้น”
ใช้บล็อก init และทำความเข้าใจลำดับการเริ่มต้นของพร็อพเพอร์ตีและบล็อก คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “บล็อก init และลำดับการเริ่มต้น” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คอนสตรักเตอร์หลักและพารามิเตอร์พร็อพเพอร์ตี
- บล็อก init และลำดับการเริ่มต้น
- Getter และ Setter แบบกำหนดเองด้วย field
- lateinit และการเริ่มต้นแบบ Lazy