Qual è l'equivalente dei campi finali statici Java in Kotlin?


132

In Java, per dichiarare una costante, fai qualcosa del tipo:

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

Qual è l'equivalente in Kotlin?


1
Dato che val in Kotlin indica la sola lettura, non sarebbe sufficiente?
IgorGanapolsky

Risposte:


213

Secondo la documentazione di Kotlin questo è equivalente:

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

Uso:

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

Anche questa è la proprietà finale statica (campo con getter):

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

E infine questo è il campo finale statico:

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

Il primo esempio (con campo const) può essere utilizzato per gli attributi. Caso popolare: dichiara tutti i percorsi delle API Web nel singolo file e fa riferimento ad esso dai controller con tale codice: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (attributo Spring Boot)
Manushin Igor

Ciao ragazzi! Sai se questo @JvmField è ancora necessario? Lo sto usando in Android e mostra un avviso di lanugine che dice che "const" può essere usato invece. L'ho cambiato in const e la classe java che lo sta usando non ha problemi.
Leandro Ocampo

1
@LeandroOcampo è ancora necessario nel caso in cui tu abbia un campo statico mutabile, const val- compila la costante di tempo e sicuramente può essere usato come sostituto @JvmField valin alcuni casi. Attraverso di esso non funziona se valore - calcolato in runtime, o non di tipo primitivo o String. Rif: kotlinlang.org/docs/reference/…
Ruslan

36

se hai un'implementazione in Hello, usa companion objectall'interno di una classe

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

}

se Helloè un oggetto singleton puro

object Hello {
  val MAX_LEN = 1 + 1
}

se le proprietà sono costanti in fase di compilazione, aggiungi una constparola chiave

object Hello {
  const val MAX_LEN = 20
}

se vuoi usarlo in Java, aggiungi l' @JvmStaticannotazione

object Hello {
  @JvmStatic val MAX_LEN = 20
}

1
la migliore risposta
rcorbellini

9

Per me

object Hello {
   const val MAX_LEN = 20
}

era troppo boilerplate. Metto semplicemente i campi finali statici sopra la mia classe in questo modo

val MIN_LENGTH = 10

class MyService{
}

2
Nei casi in cui non è necessario che la costante sia esposta al di fuori del file (es. Java private), questa definizione è la più concisa.
javaxian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.