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

บล็อก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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