¿Qué se puede express en una constante de time de compilation (const val)?

La documentation para las constantes en time de compilation enumera tres requisitos que la propiedad debe cumplir para declararla como una const val . Estos son:

  • Nivel superior o miembro de un object
  • Inicializado con un valor de tipo String o un tipo primitivo
  • Sin getter personalizado

El requisito de "No ser un usuario personalizado" me lleva a creer que no puedo usar ninguna function en una statement constante, pero parece que este no es el caso. Estos comstackn:

 const val bitmask = (5 shl 3) + 2 const val aComputedString = "Hello ${0x57.toChar()}orld${((1 shl 5) or 1).toChar()}" const val companetworkingInt = 5.compareTo(6) const val companetworkingString = "Hello".compareTo("World!") const val toStringedInt = 5.compareTo(6).toString() const val charFromString = "Hello World!".get(3) 

Sin embargo, estos no se comstackrán:

 // An extension function on Int. const val coercedInt = 3.coerceIn(1..5) // Using operator syntax to call the get-function. const val charFromString = "Hello World!"[3] // An immediate type is not a primitive. const val stringFromImmediateList = "Hello World!".toList().toString() // Using a function defined by yourself. fun foo() = "Hello world!" const val stringFromFunction = foo() 

¿Cuáles son las reglas exactas para las constantes de time de compilation?

¿Hay una list de funciones que puedo usar en una statement constante en time de compilation?

No hay documentation exacta sobre esto, pero la list de funciones que se pueden usar en las expresiones constantes se puede encontrar en las fonts del comstackdor aquí . Tenga en count que solo esas funciones se pueden usar en expresiones constantes que se definen en el package kotlin , en los operadores sobrecargados personalizados el comstackdor informará los errores.

getter no es la invocación al método, de hecho, es una parte de la statement de propiedad, por ejemplo, el código siguiente no se puede comstackr.

 const val charFromString get() = "foo" // ^--- const using getter can't be compiled 

la constante aComputedString utiliza una plantilla de cadena igual que la concatenación de cadenas en Java, por ejemplo:

 static final String aComputedString = "Hello " + ((char) 0x57) + "orld" + ((char) ((1 << 5) | 1)); 

y los opeartors están optimizados para types primitivos ya que no tienen methods en Java, por ejemplo:

 const val longValue = 1.toLong(); // java static final long longValue = (long) 1 ; 

el código sobre el que puede trabajar su kotlin.String es que está usando kotlin.String rather java.lang.String , para el tipo mapeado kotlin.String también está optimizado, ya que no hay implementación en kotlin, si testing java.lang.String directamente puede get el error esperado del comstackdor:

 typealias JavaString = java.lang.String; // v--- error const val companetworkingString = JavaString("Hello").compareTo("World!") 

el "Hello world!"[3] no puede funcionar porque el tipo de parámetro del operador de acceso indexado es vararg , por lo que el comstackdor no puede optimizarlo ya que no sabe cuántos arguments del operador get se recibirán. , por lo que se invoca dinámicamente con una list de List <KtExpression> en su lugar, por ejemplo:

 const val third = "Hello world!"[3] //error // will generate java code as static final String third = "Hello world!".charAt(3) // error 

Sin embargo, para los operadores con parameters fijos con Basic Type será optimizado por el comstackdor:

Tenga en count que estas operaciones, así como todas las demás, están optimizadas para types básicos y no introducen una sobrecarga de llamadas a funciones para ellas.

 const val comparison = "Hello" > "World";// ok 

String.get(n) puede funcionar porque kotlin.String es un tipo de kotlin.String y no tiene implementación, por lo que el comstackdor sabe cómo calcularlo, por ejemplo:

  const val third = "Hello".get(3) // ok // ^ // when you calling the `get` function, you never using `operator` at all. // it just a function invocation 

String.toList() no puede asignar a una variable constante ya que es un método de extensión y tiene implementaciones. y kotlin const val solo admiten types primitivos s y string s.

  • No se puede comstackr Android Project con Kotlin en TeamCity
  • Comparar class de datos en Kotlin sin ID
  • ¿Es necesario el conocimiento de Groovy para entender a Gradle?
  • ¿Es posible usar Kotlin en Grails?
  • ¿Cómo asigno byte en kotlin?
  • Cómo configurar Mockito para Kotlin y Android
  • Convención de nomenclatura de Kotlin para methods de retorno booleans
  • Manera fácil de mapear models de datos a models de dominio
  • Convierta un ArrayMap en ArrayList - Kotlin
  • Kotlin - Cómo encontrar y moldear un elemento por su tipo
  • agregar fragment en la actividad del fragment no funciona en Pixel XL versión de Android 8.0.0