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

Pdeva
fuente
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
    }
}
Ruslan
fuente
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
}
Gary LO
fuente
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{
}
Simon Ludwig
fuente
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