ใน Kotlin หากคุณไม่ต้องการเริ่มต้นคุณสมบัติคลาสภายในตัวสร้างหรือในส่วนบนของคลาสคุณมีสองตัวเลือกโดยทั่วไป (จากการอ้างอิงภาษา):
lazy () คือฟังก์ชั่นที่รับแลมบ์ดาและส่งคืนอินสแตนซ์ของ Lazy ซึ่งสามารถทำหน้าที่เป็นตัวแทนในการดำเนินการกับคุณสมบัติ lazy: การเรียกครั้งแรกเพื่อรับ () เรียกใช้แลมบ์ดาที่ส่งผ่านขี้เกียจ () และจดจำผลลัพธ์ เพื่อรับ () เพียงแค่ส่งคืนผลลัพธ์ที่จดจำ
ตัวอย่าง
public class Hello { val myLazyString: String by lazy { "Hello" } }
ดังนั้นการโทรแรกและการโทรย่อยทุกที่ไปยังmyLazyStringจะส่งคืน"Hello"
โดยปกติคุณสมบัติที่ประกาศว่ามีชนิดที่ไม่เป็น null จะต้องเริ่มต้นในตัวสร้าง อย่างไรก็ตามบ่อยครั้งที่สิ่งนี้ไม่สะดวก ตัวอย่างเช่นคุณสมบัติสามารถเริ่มต้นผ่านการฉีดพึ่งพาหรือในวิธีการตั้งค่าของการทดสอบหน่วย ในกรณีนี้คุณไม่สามารถจัดหา initializer ที่ไม่ใช่ค่า null ในตัวสร้าง แต่คุณยังต้องการหลีกเลี่ยงการตรวจสอบค่า Null เมื่ออ้างอิงคุณสมบัติภายในเนื้อความของคลาส
เพื่อจัดการกรณีนี้คุณสามารถทำเครื่องหมายคุณสมบัติด้วยตัวปรับล่าช้า:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
โมดิฟายเออร์สามารถใช้ได้กับคุณสมบัติ var ที่ประกาศไว้ในเนื้อความของคลาส (ไม่ใช่ในตัวสร้างหลัก) และเฉพาะเมื่อคุณสมบัติไม่มีตัวรับหรือตัวตั้งค่าที่กำหนดเอง ประเภทของทรัพย์สินจะต้องไม่เป็นโมฆะและจะต้องไม่เป็นประเภทดั้งเดิม
ดังนั้นวิธีการเลือกอย่างถูกต้องระหว่างตัวเลือกทั้งสองนี้เนื่องจากทั้งคู่สามารถแก้ปัญหาเดียวกันได้
lateinit
exposes เขตข้อมูลสำรองด้วยการมองเห็นของ setter ดังนั้นวิธีการเข้าถึงทรัพย์สินจาก Kotlin และ Java แตกต่างกัน และจากรหัส Java คุณสมบัตินี้สามารถตั้งค่าได้แม้จะnull
ไม่มีการตรวจสอบใด ๆ ใน Kotlin ดังนั้นจึงlateinit
ไม่เหมาะสำหรับการเริ่มต้นแบบขี้เกียจ แต่สำหรับการเริ่มต้นไม่จำเป็นต้องมาจากรหัส Kotlin