¿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.