คุณสมบัติต้องเริ่มต้นหรือเป็นนามธรรม


121

มันต้องเป็นคำถามที่โง่มาก แต่ฉันยังใหม่กับ Kotlin และฉันไม่พบวิธีแก้ปัญหาใด ๆ

จะประกาศเขตข้อมูลชั้นเรียนได้อย่างไร? เช่นเดียวกับที่เราสามารถมีได้ใน java:

protected SharedPreferences mSharedPreferences;

และในภายหลังonCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

ตอนนี้ฉันสามารถใช้งานได้ทุกที่ที่ต้องการ (ในคลาสย่อยของกิจกรรมพื้นฐานนี้)

ฉันพยายามทำเช่นเดียวกันใน Kotlin:

protected var sharedPreferences : SharedPreferences

และในonCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

แต่ฉันได้รับคำเตือน: "คุณสมบัติต้องเริ่มต้นหรือเป็นนามธรรม"

คำตอบ:


189

หากคุณต้องการเริ่มต้นคุณสมบัติภายนอกตัวสร้างคุณสมบัติที่เตรียมใช้งานล่าช้าคือสิ่งที่คุณอาจกำลังมองหา ประกาศคุณสมบัติด้วยlateinitตัวปรับแต่งซึ่งจะอนุญาตให้ข้ามตัวเริ่มต้นที่จำเป็นเป็นอย่างอื่นและจะทำให้การเข้าถึงคุณสมบัติล้มเหลวโดยมีข้อยกเว้นจนกว่าจะมีการกำหนดค่าที่มีความหมายให้กับมัน:

protected lateinit var sharedPreferences: SharedPreferences

12
ฉันพยายามใช้ "protected var sharedPreferences: SharedPreferences? = null" แล้วยังใช้ได้ผลแตกต่างกันอย่างไร
Anton Shkurenko

ฉันเห็นว่าถ้าฉันใช้ Dagger2 สำหรับ DI ฉันต้องใช้ตัวแปรของคุณใช่ไหม?
Anton Shkurenko

30
ความแตกต่างคือคุณสามารถประกาศค่าที่ไม่เป็นค่าว่างได้ด้วย lateinit
Kirill Rakhman

16

ดึงสิ่งนี้ออกจากความคิดเห็นจากคำตอบของ Alexander Udalov เพื่อการมองเห็น สำหรับคุณสมบัติที่เป็นโมฆะ:

protected var sharedPreferences : SharedPreferences? = null

... และกำหนดค่าในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.