¿Cuál es el equivalente de los campos finales estáticos de Java en Kotlin?


132

En Java, para declarar una constante, haces algo como:

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

¿Cuál es el equivalente en Kotlin?


1
Dado que val en Kotlin connota solo lectura, ¿no sería suficiente?
— IgorGanapolsky

Respuestas:


213

Según la documentación de Kotlin , esto es equivalente:

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

Uso:

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

También esta es la propiedad final estática (campo con getter):

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

Y finalmente este es el campo estático final:

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

El primer ejemplo (con campo constante) se puede usar para atributos. Caso popular: declare todas las rutas de API web en el archivo único y haga referencia a él desde los controladores con dicho código: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (atributo Spring Boot)
— Manushin Igor

¡Hola chicos! ¿Sabes si este @JvmField sigue siendo necesario? Estoy usando esto en Android y muestra una advertencia de pelusa que dice que "const" se puede usar en su lugar. Lo cambié a const y la clase de Java que lo está utilizando no tiene ningún problema.
— Leandro Ocampo

1
@LeandroOcampo aún es necesario en caso de que tenga un campo estático mutable, const valcompile la constante de tiempo y, con seguridad, puede usarse como reemplazo @JvmField valen algunos casos. A través de él no funciona si el valor se calcula en tiempo de ejecución, o no es un tipo primitivo o una cadena. Ref: kotlinlang.org/docs/reference/…
— Ruslan

36

si tiene una implementación en Hello, use companion objectdentro de una clase

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

}

si Helloes un objeto singleton puro

object Hello {
  val MAX_LEN = 1 + 1
}

si las propiedades son constantes de tiempo de compilación, agregue una constpalabra clave

object Hello {
  const val MAX_LEN = 20
}

si quieres usarlo en Java, agrega @JvmStaticanotaciones

object Hello {
  @JvmStatic val MAX_LEN = 20
}

1
la mejor respuesta
— rcorbellini

9

Para mi

object Hello {
   const val MAX_LEN = 20
}

fue demasiado repetitivo. Simplemente pongo los campos finales estáticos por encima de mi clase de esta manera

val MIN_LENGTH = 10

class MyService{
}

2
En los casos en que no necesita que la constante se exponga fuera del archivo (es decir, Java private), esta definición es la más concisa.
— javaxian
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.