const val în Kotlin

Clase și obiecte Kotlin 1.0

const val declară o constantă cunoscută la compilare (număr, text, Boolean), înlocuită direct în cod.

Sintaxă
const val NUME = valoare          // la nivelul de sus

object Config { const val PORT = 8080 }
class X { companion object { const val MAX = 10 } }

Ce face const val

const val este o constantă a cărei valoare este cunoscută la compilare. Compilatorul copiază valoarea direct în locurile unde este folosită. Este permis doar pentru tipuri primitive (Int, Double, Boolean, Char…) și String, iar valoarea trebuie să fie un literal sau o expresie din alte constante (const val SECUNDE_PE_ZI = 24 * 60 * 60).

const se poate pune doar la nivelul de sus al fișierului, într-un object sau într-un companion object, nu într-o clasă obișnuită sau într-o funcție. Constantele pot fi folosite în adnotări, unde un val obișnuit nu este acceptat. Convenția este să le scrii cu MAJUSCULE_ȘI_LINIUȚE.

Diferența față de val: un val poate primi valoarea la rulare (val azi = LocalDate.now()), un const val nu.

Exemple

Exemplul 1: Constante la nivelul de sus

Constantele pot fi calculate din alte constante. TVA și MONEDA se folosesc ca orice variabilă.

const val TVA = 0.21
const val MONEDA = "lei"
const val SECUNDE_PE_ZI = 24 * 60 * 60
const val SALUT = "Bun venit pe dexblog.ro"

fun main() {
    val pret = 200.0
    println("Preț cu TVA: ${pret * (1 + TVA)} $MONEDA")
    println("O zi are $SECUNDE_PE_ZI secunde")
    println(SALUT)
}

Rezultat

Preț cu TVA: 242.0 lei
O zi are 86400 secunde
Bun venit pe dexblog.ro

Exemplul 2: Constante într-un companion object

Constantele care țin de o clasă stau în companion object și se folosesc cu numele clasei.

class Parola(val text: String) {
    companion object {
        const val LUNGIME_MINIMA = 8
        const val MESAJ = "Parola trebuie să aibă minimum $LUNGIME_MINIMA caractere"
    }

    fun esteValida() = text.length >= LUNGIME_MINIMA
}

fun main() {
    println(Parola.MESAJ)
    println("ana123 validă? ${Parola("ana123").esteValida()}")
    println("Iasi2026! validă? ${Parola("Iasi2026!").esteValida()}")
}

Rezultat

Parola trebuie să aibă minimum 8 caractere
ana123 validă? false
Iasi2026! validă? true

Exemplul 3: const în object și în adnotări

@Suppress cere o valoare constantă; Avertismente.NEFOLOSITA merge pentru că este const. Fără adnotare, variabila nefolosită ar opri compilarea cu -Werror.

object Avertismente {
    const val NEFOLOSITA = "UNUSED_VARIABLE"
}

object Config {
    const val SERVER = "api.exemplu.ro"
    const val PORT = 8080
}

fun main() {
    @Suppress(Avertismente.NEFOLOSITA)
    val temporar = 0
    println("Mă conectez la ${Config.SERVER}:${Config.PORT}")
}

Rezultat

Mă conectez la api.exemplu.ro:8080

Greșeli frecvente

  • const val azi = LocalDate.now(): valoarea nu este cunoscută la compilare (eroare const 'val' initializer must be a constant value). Folosește val.
  • const într-o clasă obișnuită sau într-o funcție: nu este permis. Mută constanta în companion object sau la nivelul de sus.
  • const val pentru o listă: doar primitivele și String pot fi const.

Comenzi înrudite

  • val și var: val declară o variabilă care nu mai poate fi schimbată după atribuire; var declară una care poate primi altă valoare.
  • companion object: companion object ține membrii care aparțin clasei, nu fiecărui obiect: constante, funcții de creare, contoare comune.
  • object: object declară o clasă cu un singur obiect (singleton) sau creează pe loc un obiect anonim care implementează o interfață.
  • annotation class și ținte de adnotare: annotation class declară o adnotare (@Nume) care adaugă informații la cod; @field:, @get:, @file: aleg exact unde se pune.