อะไรคือสิ่งที่เทียบเท่ากับ Java static final fields ใน Kotlin?


133

ใน Java หากต้องการประกาศค่าคงที่คุณต้องทำสิ่งต่อไปนี้

class Hello {
    public static final int MAX_LEN = 20;
}

เทียบเท่าใน Kotlin คืออะไร?


1
เนื่องจากvalใน Kotlin มีความหมายว่าอ่านอย่างเดียวมันจะไม่พอหรือ?
IgorGanapolsky

คำตอบ:


213

ตามเอกสารของ Kotlin สิ่งนี้เทียบเท่า:

class Hello {
    companion object {
        const val MAX_LEN = 20
    }
}

การใช้งาน:

fun main(srgs: Array<String>) {
    println(Hello.MAX_LEN)
}

นี่คือคุณสมบัติสุดท้ายแบบคงที่ (ฟิลด์ที่มี getter):

class Hello {
    companion object {
        @JvmStatic val MAX_LEN = 20
    }
}

และในที่สุดนี่คือฟิลด์สุดท้ายแบบคงที่:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}

ตัวอย่างแรก (พร้อมช่อง const) สามารถใช้สำหรับแอตทริบิวต์ กรณียอดนิยม: ประกาศเส้นทาง API ของเว็บทั้งหมดในไฟล์เดียวและอ้างอิงจากตัวควบคุมด้วยรหัสดังกล่าว: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (แอตทริบิวต์ Spring Boot)
Manushin Igor

สวัสดีทุกคน! คุณรู้หรือไม่ว่า @JvmField นี้ยังจำเป็นอยู่หรือไม่? ฉันใช้สิ่งนี้ใน Android และมันแสดงคำเตือนที่เป็นขุยบอกว่าสามารถใช้ "const" แทนได้ ฉันเปลี่ยนเป็น const และคลาส java ที่ใช้อยู่ไม่มีปัญหาใด ๆ
Leandro Ocampo

1
@LeandroOcampo ยังจำเป็นในกรณีที่คุณมีฟิลด์คงที่ที่ไม่แน่นอนconst val- รวบรวมค่าคงที่ของเวลาและแน่นอนว่าสามารถใช้แทนได้@JvmField valในบางกรณี วิธีนี้ใช้ไม่ได้หากค่า - คำนวณในรันไทม์หรือไม่ใช่ประเภทดั้งเดิมหรือสตริง อ้าง: kotlinlang.org/docs/reference/…
Ruslan

36

หากคุณมีการนำไปใช้งานHelloให้ใช้companion objectภายในชั้นเรียน

class Hello {
  companion object {
    val MAX_LEN = 1 + 1
  }

}

ถ้าHelloเป็นวัตถุซิงเกิลตันที่บริสุทธิ์

object Hello {
  val MAX_LEN = 1 + 1
}

หากคุณสมบัติเป็นค่าคงที่เวลาคอมไพล์ให้เพิ่ม a constคีย์เวิร์ด

object Hello {
  const val MAX_LEN = 20
}

หากคุณต้องการใช้ใน Java ให้เพิ่ม@JvmStaticคำอธิบายประกอบ

object Hello {
  @JvmStatic val MAX_LEN = 20
}

1
คำตอบที่ดีที่สุด
rcorbellini

9

สำหรับฉัน

object Hello {
   const val MAX_LEN = 20
}

เป็นหม้อต้มมาก ฉันใส่ฟิลด์สุดท้ายแบบคงที่ไว้เหนือชั้นเรียนแบบนี้

val MIN_LENGTH = 10

class MyService{
}

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