Apa yang setara dengan kolom final statis Java di Kotlin?

132

Di Java, untuk mendeklarasikan sebuah konstanta, Anda melakukan sesuatu seperti:

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

Apa yang setara di Kotlin?

pdeva
sumber
1
Karena val di Kotlin berkonotasi hanya-baca, bukankah itu cukup?
IgorGanapolsky

Jawaban:

213

Menurut dokumentasi Kotlin, ini setara:

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

Pemakaian:

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

Juga ini adalah properti akhir statis (bidang dengan pengambil):

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

Dan akhirnya ini adalah bidang terakhir statis:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}
Ruslan
sumber
Contoh pertama (dengan field const) dapat digunakan untuk atribut. Kasus populer: mendeklarasikan semua jalur api web dalam satu file dan mereferensikannya dari pengontrol dengan kode seperti: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (atribut Spring Boot)
Manushin Igor
Hai kawan! Apakah Anda tahu jika @JvmField ini masih diperlukan? Saya menggunakan ini di android dan ini menunjukkan peringatan lint yang mengatakan bahwa "const" dapat digunakan sebagai gantinya. Saya mengubahnya menjadi const dan kelas java yang menggunakannya tidak memiliki masalah.
Leandro Ocampo
1
@LeandroOcampo itu masih diperlukan jika Anda memiliki bidang statis yang dapat berubah, const val- kompilasi konstanta waktu dan pasti dapat digunakan sebagai pengganti @JvmField valdalam beberapa kasus. Melalui itu tidak berfungsi jika nilai - dihitung dalam runtime, atau bukan tipe primitif atau String. Ref: kotlinlang.org/docs/reference/…
Ruslan
36

jika Anda memiliki implementasi dalam Hello, gunakan companion objectdi dalam kelas

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

}

jika Helloadalah objek tunggal murni

object Hello {
  val MAX_LEN = 1 + 1
}

jika propertinya adalah konstanta waktu kompilasi, tambahkan constkata kunci

object Hello {
  const val MAX_LEN = 20
}

jika Anda ingin menggunakannya di Java, tambahkan @JvmStaticanotasi

object Hello {
  @JvmStatic val MAX_LEN = 20
}
Gary LO
sumber
1
jawaban terbaik
rcorbellini
9

Untuk saya

object Hello {
   const val MAX_LEN = 20
}

adalah terlalu banyak boilerplate. Saya dengan sederhana meletakkan bidang terakhir statis di atas kelas saya seperti ini

val MIN_LENGTH = 10

class MyService{
}
Simon Ludwig
sumber
2
Dalam kasus di mana Anda tidak memerlukan konstanta untuk diekspos di luar file (mis. Java private), definisi ini adalah yang paling ringkas.
javaxian